为什么我的基类指针变量可以从派生类访问函数?

时间:2014-01-06 13:48:38

标签: c++ inheritance

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()是错误

谢谢!

3 个答案:

答案 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 = &rect;
  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