默认的析构函数和继承

时间:2013-01-11 15:17:08

标签: c++ inheritance

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

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

3 个答案:

答案 0 :(得分:6)

是的,它仍然是安全的。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

是的,这是安全的。

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