我有这段代码:
#include <iostream>
using namespace std;
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
int area ()
{ return 0; }
void set2_values (int,int);
virtual bool incompressible() const = 0;
};
bool Polygon::incompressible() const {
return 1;
}
void Polygon::set2_values (int x, int y) {
width = x;
height = y;
}
class Rectangle: public Polygon {
public:
int area ()
{ return width * height; }
virtual bool incompressible() const {
return 1;
}
};
class Triangle: public Polygon {
public:
int area ()
{ return (width * height / 2); }
bool incompressible() const {
return 0;
}
};
int main () {
Rectangle rect;
Triangle trgl;
Polygon poly;
Polygon * ppoly1 = ▭
Polygon * ppoly2 = &trgl;
Polygon * ppoly3 = &poly;
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
ppoly3->set_values (4,5);
ppoly3->set2_values (4,5);
//ppoly3->incompressible();
cout << ppoly1->area() << '\n';
cout << ppoly3->incompressible() << '\n';
cout << ppoly2->area() << '\n';
cout << ppoly3->area() << '\n';
return 0;
}
我收到错误:
不能将变量'poly'声明为抽象类型'Polygon',因为以下虚函数在'Polygon'中是纯的:virtual bool Polygon :: incompressible()const
任何人都可以解释我收到此错误的原因吗?
答案 0 :(得分:2)
错误不言自明。 Polygon
是一个抽象类,因为它的incompressible()
方法是抽象的。 Polygon
为incompressible()
提供了默认的正文实现,但这并没有改变incompressible()
类定义中Polygon
被声明为抽象的事实。
因此,您只是无法直接实例化抽象Polygon
类的对象实例。但这正是您的poly
变量正在尝试做的事情。
您必须实例化覆盖Polygon
的{{1}}后代,以便它不再是抽象的。这意味着将您的incompressible()
变量更改为poly
或Rectangle
而不是Triangle
。或者只是摆脱Polygon
,因为你的其他变量正在充分展示poly
后代的多态性。