基类为抽象时,声明子类的对象

时间:2019-12-19 18:50:49

标签: c++ inheritance abstract-class virtual-functions

我正在学习虚函数和抽象类,似乎我很难理解某些东西。假设我有以下代码:

class animal {
  public:
    virtual void show()=0;
};

class dog : public animal {
  int weight;
};


int main()
{
  //animal a;
  dog d;
  return 0;
};

由于动物类是抽象类,并且我不可以声明该类的对象,所以我理解动物a是不正确的。但是,为什么狗d也不正确? (假设class狗不是抽象的,所以我可以声明dog对象)

提前谢谢!

2 个答案:

答案 0 :(得分:1)

派生类Dog也是一个抽象类,因为纯虚函数show不会被覆盖。因此,类Dog具有相同的纯虚函数。

请注意,如果您需要多态性,则必须将基类的析构函数声明为virtual。

至少你可以写

class animal {
  public:
    virtual ~animal() = default;
    virtual void show()=0;
};

答案 1 :(得分:0)

这里缺少的重要概念是抽象类animal具有所谓的纯虚函数,在您的情况下为

virtual void show()=0;

通常,覆盖虚拟功能是可选的。在您的情况下,由于已通过在末尾添加=0来将虚拟函数声明为 pure ,因此C ++编译器要求您在从{继承的所有类中重写show() {1}},例如animal

要使您的dog类不抽象并且与dog接口兼容,请在animal中为show()添加一个函数定义,以便编译器可以成功链接其父级的纯虚函数。看起来像这样:

dog