在该计划中:
struct A
{
virtual ~A(){ }
};
struct B : A
{
~B(){ }
};
int main(){ }
标准N4296::12.4/9
:
如果一个类有一个带有虚析构函数的基类,那么它的析构函数 (无论是用户还是隐式声明)都是虚拟的。
因此,编译器会将struct B
中的析构函数重新声明为虚拟,对吧?为什么我们允许声明这样的析构函数呢?对另一位开发者来说可能有点混乱。
答案 0 :(得分:5)
无论您是否声明virtual
,覆盖虚拟成员函数的函数始终是虚拟的。因此,B::~B()
始终是虚拟的,因为A::~A()
是虚拟的。
答案 1 :(得分:1)
是。你的理解是正确的。
为什么我们允许声明这样的析构函数呢?
我同意你的看法,它有点困惑,但你可以通过从基类中删除virtual
来删除所有基类和派生类的功能的虚拟性。