为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们需要C ++中的纯虚拟析构函数?

为什么我们需要C ++中的纯虚拟析构函数?

C++
牧羊人nacy 2019-10-05 14:31:23
我了解需要虚拟析构函数。但是为什么我们需要一个纯虚拟析构函数?在一篇C ++文章中,作者提到了当我们要使类抽象时,我们使用纯虚拟析构函数。但是我们可以通过将任何成员函数设为纯虚函数来使类抽象。所以我的问题是我们什么时候才能真正使析构函数成为纯虚拟的?有人可以举一个很好的实时例子吗?当我们创建抽象类时,是否使析构函数也成为纯虚拟的,是一种好习惯?如果是的话..那为什么呢?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

允许纯虚拟析构函数的真正原因可能是,禁止它们意味着在语言中添加另一条规则,并且不需要此规则,因为允许纯虚拟析构函数不会带来任何不良影响。


不,普通的旧虚拟就足够了。


如果使用默认实现为其虚拟方法创建对象,并希望使其抽象而不强迫任何人重写任何特定方法,则可以将析构函数设为纯虚拟。我看不出很多意义,但是有可能。


请注意,由于编译器将为派生类生成隐式析构函数,因此,如果类的作者不这样做,则任何派生类都不会是抽象的。因此,在基类中具有纯虚拟析构函数不会对派生类产生任何影响。它只会使基类成为抽象类(感谢@kappa的注释)。


人们可能还认为,每个派生类可能都需要具有特定的清理代码,并使用纯虚拟析构函数作为提示来编写它,但这似乎是人为的(并且不强制执行)。


注意:析构函数是唯一的方法,即使它是纯虚拟的,也必须具有实现才能实例化派生类(是的,纯虚拟函数可以具有实现)。


struct foo {

    virtual void bar() = 0;

};


void foo::bar() { /* default implementation */ }


class foof : public foo {

    void bar() { foo::bar(); } // have to explicitly call default implementation.

};


查看完整回答
反对 回复 2019-10-05
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您需要的抽象类至少是一个纯虚函数。任何功能都可以;但是碰巧的是,析构函数是任何类都会拥有的东西-因此它始终是候选对象。此外,使析构函数为纯虚拟的(而不是纯虚拟的)除了使类抽象之外,没有行为方面的副作用。因此,许多样式指南建议始终使用纯虚拟destuctor表示类是抽象的—如果出于其他原因,它提供了一致的位置,那么阅读代码的人可以查看该类是否是抽象的。


查看完整回答
反对 回复 2019-10-05
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

如果要创建抽象基类:


这不能被实例化(是的,这是多余的与术语“抽象”!)

但需要虚拟析构函数的行为(您打算携带指向ABC的指针,而不是指向派生类型的指针,并通过它们进行删除)

但并不需要任何其他虚拟调度其他方法的行为(也许还有有没有其他的方法呢?考虑一个简单的受保护的“资源”的容器,它需要一个构造函数/析构函数/分配,但仅此而已)

...最简单的方法是使析构函数成为纯虚函数,并为其提供定义(方法主体),从而使类抽象。


对于我们假设的ABC:


您保证无法实例化它(即使是在类本身内部,这也就是为什么私有构造函数可能不够用),您可以得到析构函数所需的虚拟行为,而不必查找和标记另一个不需要将虚拟调度作为“虚拟”。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1052 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信