在派生类中声明非虚拟析构函数是否安全

时间:2015-06-05 04:18:08

标签: c++ inheritance destructor virtual-functions

在该计划中:

struct A
{
    virtual ~A(){ }
};

struct B : A
{
    ~B(){ }
};
int main(){ }

标准N4296::12.4/9

  

如果一个类有一个带有虚析构函数的基类,那么它的析构函数   (无论是用户还是隐式声明)都是虚拟的。

因此,编译器会将struct B中的析构函数重新声明为虚拟,对吧?为什么我们允许声明这样的析构函数呢?对另一位开发者来说可能有点混乱。

2 个答案:

答案 0 :(得分:5)

无论您是否声明virtual,覆盖虚拟成员函数的函数始终是虚拟的。因此,B::~B()始终是虚拟的,因为A::~A()是虚拟的。

答案 1 :(得分:1)

是。你的理解是正确的。

  

为什么我们允许声明这样的析构函数呢?

我同意你的看法,它有点困惑,但你可以通过从基类中删除virtual来删除所有基类和派生类的功能的虚拟性。