猿问

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

我了解需要虚拟析构函数。但是为什么我们需要一个纯虚拟析构函数?在一篇C ++文章中,作者提到了当我们要使类抽象时,我们使用纯虚拟析构函数。

但是我们可以通过将任何成员函数设为纯虚函数来使类抽象。

所以我的问题是

  1. 我们什么时候才能真正使析构函数成为纯虚拟的?有人可以举一个很好的实时例子吗?

  2. 当我们创建抽象类时,是否使析构函数也成为纯虚拟的,是一种好习惯?如果是的话..那为什么呢?


牧羊人nacy
浏览 1053回答 3
3回答

鸿蒙传说

允许纯虚拟析构函数的真正原因可能是,禁止它们意味着在语言中添加另一条规则,并且不需要此规则,因为允许纯虚拟析构函数不会带来任何不良影响。不,普通的旧虚拟就足够了。如果使用默认实现为其虚拟方法创建对象,并希望使其抽象而不强迫任何人重写任何特定方法,则可以将析构函数设为纯虚拟。我看不出很多意义,但是有可能。请注意,由于编译器将为派生类生成隐式析构函数,因此,如果类的作者不这样做,则任何派生类都不会是抽象的。因此,在基类中具有纯虚拟析构函数不会对派生类产生任何影响。它只会使基类成为抽象类(感谢@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.};

慕工程0101907

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

慕的地8271018

如果要创建抽象基类:这不能被实例化(是的,这是多余的与术语“抽象”!)但需要虚拟析构函数的行为(您打算携带指向ABC的指针,而不是指向派生类型的指针,并通过它们进行删除)但并不需要任何其他虚拟调度其他方法的行为(也许还有有没有其他的方法呢?考虑一个简单的受保护的“资源”的容器,它需要一个构造函数/析构函数/分配,但仅此而已)...最简单的方法是使析构函数成为纯虚函数,并为其提供定义(方法主体),从而使类抽象。对于我们假设的ABC:您保证无法实例化它(即使是在类本身内部,这也就是为什么私有构造函数可能不够用),您可以得到析构函数所需的虚拟行为,而不必查找和标记另一个不需要将虚拟调度作为“虚拟”。
随时随地看视频慕课网APP
我要回答