3

考虑一个简单的界面/实现设计:

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中实现一个虚拟的空析构函数。但我想知道这是否是多余和不必要的,是否有任何我不知道的“陷阱”。

4

3 回答 3

8

是的,它仍然是安全的。

如果任何基类析构函数是虚拟的,则析构函数自动是虚拟的。无论您键入~Foo();virtual ~Foo();不键入并且只允许编译器生成隐式定义的析构函数,这都是正确的。

于 2013-01-11T15:19:17.663 回答
4

这是安全的。您只需要确保基类中的析构函数是virtual.
只要您的基类析构函数是virtual编译器,编译器就会负责以正确的顺序调用所有析构函数。

在大多数派生类中是否需要析构函数取决于该类本身,并且该决定通常基于Rule of Three做出。

于 2013-01-11T15:18:46.210 回答
3

是的,它是安全的。

隐式生成的析构函数将是虚拟的,因为有一个带有虚拟析构函数的基类,并且会正确调用所有非平凡成员和基类的析构函数。

于 2013-01-11T15:21:49.437 回答