默认的析构函数和继承

Zee*_*bit 1 c++ inheritance

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

class Base
{
public:

    virtual ~Base()
    {
        // Virtual empty destructor
    }
};

class Derived : public Base
{
public:

    virtual ~Derived()
    {
        // Lots of clean up code here
        // ...
    }
};
Run Code Online (Sandbox Code Playgroud)

通过这种设计,我了解以下代码是安全有效的:

Base* base = new Derived();
delete base; // Both Base::~Base and Derived::~Derived get called
Run Code Online (Sandbox Code Playgroud)

但是,想象一下是否有新课程:

class DerivedEx : public Derived
{
public:

    // No destructor here, relying on default destructor generated by compiler
};
Run Code Online (Sandbox Code Playgroud)

DerivedEx "安全"?

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

asc*_*ler 6

是的,它仍然是安全的.

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