在我的C ++项目中,.h文件中有一个'Shape'类及其子类'Square':
class Shape {
public:
Shape();
Shape(int, int, string);
virtual ~Shape();
virtual void draw();
private:
int length, width;
string colour;
};
class Square : public Shape {
public:
Square(int, int, string);
void draw();
};
在.cpp文件中,我实现了构造函数等。
Shape::Shape() : length(0), width(0) {}
Shape::Shape(int len, int wid, string col) : length(len), width(wid), colour(col) {}
Shape::~Shape() {} //destructor
virtual void Shape::draw(){};
Square::Square(int len, int wid, string col) : Shape(len, wid, col) {}
void Square::draw() {cout << "I am drawing a square" << endl;};
我试图按如下所示在主要功能中对其进行测试,只需按一个正方形即可。
int main() {
int count(0);
vector<Shape*> shapes;
shapes.push_back(new Square(10, 10, "orange"));
for (Shape* shp : shapes) {
cout << "\nShape " << count++ << ":";
shp->draw();
} // end for
for (Shape* shp : shapes)
delete shp;
return 0;
}
理想情况下,输出看起来像这样:
形状0: 我正在画一个正方形
但是,输出的只是
形状0:
如果我将某些输出放入void Shape::draw(){};
之类的void Shape::draw(){cout << "I am just a shape" <<endl;};
中,则输出为Shape 0:我只是一个形状。
这告诉我该函数仅在Shape :: draw()函数结束,而不会被覆盖。代码确实可以正常运行,但是.cpp和.h中发生了什么,这阻止了继承? 编辑:将绘制功能声明为虚拟钉在棺材上的钉子。