在带有虚析构函数的基类的子类中不指定析构函数是否安全?

Is it safe to not specify a destructor in a subclass of a base class with a virtual destructor?

本文关键字:析构函数 是否 安全 子类 基类      更新时间:2023-10-16

考虑一个简单的接口/实现设计:

class Base
{
public:
    virtual ~Base()
    {
        // Virtual empty destructor
    }
};
class Derived : public Base
{
public:
    virtual ~Derived()
    {
        // Lots of clean up code here
        // ...
    }
};

有了这样的设计,我明白下面的代码是安全有效的:

Base* base = new Derived();
delete base; // Both Base::~Base and Derived::~Derived get called
但是,想象一下如果有一个新的类:
class DerivedEx : public Derived
{
public:
    // No destructor here, relying on default destructor generated by compiler
};

DerivedEx"安全"吗?

为了安全起见,我总是假设必须在DerivedEx中实现虚空析构函数。但我想知道这是否多余和不必要,是否有任何我不知道的"陷阱"。

是的,它还是安全的。

如果任何基类析构函数为虚函数,则析构函数自动为虚函数。无论您键入~Foo();还是virtual ~Foo();,或者两者都不输入,都是如此,只允许编译器生成隐式定义的析构函数。

安全。你只需要确保基类中的析构函数是virtual
只要你的基类析构函数是virtual,编译器就会按照正确的顺序调用所有的析构函数。

在大多数派生类中是否需要析构函数取决于该类本身&这个决定通常是根据三规则做出的。

是的,它是安全的。

隐式生成的析构函数将是虚函数,因为存在一个带有虚析构函数的基类,并且将正确调用所有重要成员和基类的析构函数。