class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
};
class Rectangle: public Polygon {
public:
int area()
{ return width*height; }
};
int main () {
Rectangle rect;
Polygon * ppoly1 = ▭
ppoly1->set_values (4,5);
cout << rect.area() << '\n';
return 0;
}
在上面的示例中, ppoly1 指向的是什么以及此指针如何无法访问矩形类的函数?
为什么ppoly1-&gt; area()是错误
谢谢!
答案 0 :(得分:6)
表达式ppoly1->area()
是一个错误,因为ppoly1
的类型为Polygon
,没有声明area
方法。当C ++尝试评估此成员时,它基本上从Polygon
开始,看不到名为area
的成员,因此发出错误
听起来你想给Polygon
类型一个没有实现的area
方法的概念(强制派生类型提供一个)。如果是这种情况,那么您应该在Polygon
class Polygon {
...
virtual ~Polygon() { }
virtual int area() = 0;
};
答案 1 :(得分:0)
基类对其派生类一无所知。当定义基类时,还没有任何派生类。
变量ppoly1属于Polygon *类型。类Polygon没有方法区域,因此编译器会发出错误。
如果要为派生类使用公共接口,则应在基类中声明它。例如
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
virtual int area() const = 0;
virtual ~Polygon(){}
};
class Rectangle: public Polygon {
public:
int area() const
{ return width*height; }
};
int main () {
Rectangle rect;
Polygon * ppoly1 = ▭
ppoly1->set_values (4,5);
cout << rect.area() << '\n';
return 0;
}
答案 2 :(得分:0)
ppoly1
是一个多边形指针。指针指向Rectangle对象的事实不会使它调用Rectangle函数;类型仍为Polygon*
。要使它能够调用Rectangle函数,您需要使其成为Rectangle指针,或者在Polygon类中实现虚方法,
e.g。
virtual int area() const;
这意味着当Polygon对象调用area()
时,它将查找area()
的派生程度最高的实例。在ppoly1
,这将是Rectangle->area()
。您可以将Rectangle
代码保持原样。
关于虚拟功能的维基百科:http://en.wikipedia.org/wiki/Virtual_function