小编典典

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

all

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

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

所以我的问题是

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

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


阅读 55

收藏
2022-08-21

共1个答案

小编典典

  1. 可能允许纯虚拟析构函数的真正原因是禁止它们意味着向语言添加另一条规则,并且不需要这条规则,因为允许纯虚拟析构函数不会产生不良影响。

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

如果您为其虚拟方法创建一个具有默认实现的对象,并希望使其抽象而不强制任何人覆盖任何 特定
方法,则可以使析构函数纯虚拟。我认为这没什么意义,但这是可能的。

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

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

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

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.
};
2022-08-21