当基础 class 是抽象时,声明一个 subclass 的对象

Declaring an object of a subclass when the base class is abstract

我正在学习虚函数和抽象classes,似乎我在理解某些东西时遇到了困难。假设我有这段代码:

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

class dog : public animal {
  int weight;
};


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

我明白动物 a 是多么不正确,因为动物 class 是抽象的,我不能声明这个 class 的对象。但是,为什么dog d也不对呢? (假设 class dog 不是抽象的,所以我可以声明 dog 对象)

提前致谢!!

派生的classDog也是一个抽象class,因为纯虚函数show没有被覆盖。所以 class Dog 具有相同的纯虚函数。

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

至少你会写

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

您在这里缺少的重要概念是您的抽象 class、animal 具有所谓的 纯虚函数,它在你的情况是

virtual void show()=0;

通常,覆盖虚函数是可选的。在您的情况下,因为您通过在末尾添加 =0 将虚函数声明为 pure,C++ 编译器要求您在所有 class继承自animal的es,例如dog.

为了让你的 dog class 非抽象并符合你的 animal 接口,在 dog 中添加 show() 的函数定义,所以编译器可以成功 link 其父级的纯虚函数。那看起来像这样:

class dog : public animal {
 inline void show()
    { //something here
      return;
    };
  int weight;
};