我正在尝试将print函数从抽象类“shape”传递给派生类“circle”和“square”。它应打印出“名称:”,后跟形状名称。出于某种原因,它无法正常工作。我是否需要为每个派生类重新声明并重新定义print?或者我没有正确传递它,或者名称是否未正确存储在派生函数中?
为了澄清:我只是想让它在循环数组时正确打印出来。任何建议将不胜感激。
谢谢!
这些应该是相关的代码:
print()在形状头文件中声明。
In shape.cpp
void shape::setName( const string &shapeName )
{
name = shapeName;
}
//return name
string shape::getName() const
{
return name;
}
void shape::print() const
{
cout<<"Name: "<<getName()<<endl;
}
square://中的构造函数(与其他派生类相同)
square::square(const string &name, const int &sideLength)
: shape ( name )
{
setSideLength(sideLength);
}
主要:
//create derived class objects with side lengths:
square square1(
"square", 3);
//an object array named shapesArray is created with an instance of square and circle
for(int x = 0; x < 3; x++)
{
shapesArray[x]->print();
cout<<"The distance around this shape is: "<<shapesArray[x]->getDistanceAround()<<endl;
答案 0 :(得分:1)
如果要使用指针,最好使用动态绑定的C ++功能和virtual
函数:
virtual string shape::getName() const //in shape
{
return "shape";
}
virtual string square::getname() const //in square
{
return "square";
}
shape *s();
s = &shapeobj;
s.getName(); //shape
s = &squareobj;
s.getName(); //square
答案 1 :(得分:1)
从你的标题中,我假设你在一个标题shape.h中有一个抽象的基类,你没有向我们展示,以及声明 print()。
在每个派生类中都算作声明。现在,您需要在每个派生类中定义 print(),以提供实现。它看起来像:
void square::print() {
// implementation
}
void triangle::print() {
// implementation
}
无论您在cpp文件中提供定义,还需要在头文件中提供声明。标题是你的类的声明,cpp只是实现。
答案 2 :(得分:1)
我认为你要做的是如下所示。你需要通过独占调用setname方法或者在它们的构造函数本身中为派生类正确设置“name”。
class Shape
{
public:
string name;
void setName( const string &shapeName )
{
name = shapeName;
}
string getName() const
{
return name;
}
void print() const
{
cout<<"Name: "<<getName()<<endl;
}
};
class Circle:public Shape
{
public:
Circle()
{
name = "Circle";
}
};
class Square:public Shape
{
public:
Square()
{
name = "Square";
}
};
int main()
{
Shape* shapesArray[5];
shapesArray[0]->setName("check");
Circle lCircle;
shapesArray[1]=&lCircle;
Square lSquare;
shapesArray[2]=&lSquare;
for(int x = 0; x < 3; x++)
{
shapesArray[x]->print();
}
}