虚函数

时间:2016-10-27 18:07:55

标签: c++ c++11

我有这段代码:

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

任何人都可以解释我收到此错误的原因吗?

1 个答案:

答案 0 :(得分:2)

错误不言自明。 Polygon是一个抽象类,因为它的incompressible()方法是抽象的。 Polygonincompressible()提供了默认的正文实现,但这并没有改变incompressible()类定义中Polygon被声明为抽象的事实。

因此,您只是无法直接实例化抽象Polygon类的对象实例。但这正是您的poly变量正在尝试做的事情。

您必须实例化覆盖Polygon的{​​{1}}后代,以便它不再是抽象的。这意味着将您的incompressible()变量更改为polyRectangle而不是Triangle。或者只是摆脱Polygon,因为你的其他变量正在充分展示poly后代的多态性。