【问题标题】:Declaring an object of a subclass when the base class is abstract基类为抽象时声明子类的对象
【发布时间】:2020-04-12 09:14:52
【问题描述】:

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

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

class dog : public animal {
  int weight;
};


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

我了解动物 a 的不正确之处,因为动物类是抽象的,并且我不允许声明此类的对象。但是,为什么狗d也不对呢? (假设 dog 类不是抽象的,所以我可以声明 dog 对象)

提前致谢!!

【问题讨论】:

  • 因为你没有覆盖show所以dog也是抽象的
  • “鉴于 dog 类不是抽象的,所以我可以声明 dog 对象” 这是一个不正确的假设。 dog 也有一个纯虚拟的 show() 继承自 animal
  • 好吧,我超越了节目,一切都很顺利。非常感谢!!!

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


【解决方案1】:

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

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

至少你会写

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

【讨论】:

  • 请注意,在给出的示例中,虚拟析构函数不是必需,而是强烈推荐。您不需要虚拟析构函数,除非您计划通过在基类指针上调用 delete 来销毁派生对象,在这种情况下,需要虚拟调度以确保调用所有派生析构函数。在本例中并非如此。
【解决方案2】:

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

virtual void show()=0;

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

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

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

【讨论】:

  • 在类定义中定义函数时,我们通常不使用inline关键字。
  • 当定义在类定义中时,还有其他方法可以使函数inlined 吗?我想我不关注
  • @alteredinstance -- 在类定义中定义的函数是内联的。这就是为什么你不需要说出来。
猜你喜欢
  • 2021-06-10
  • 2010-10-17
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2017-01-08
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多