我有一个简单的程序:
struct B
{
virtual ~B() {}
};
struct D : public B
{
~D() {}
};
所以,当我打电话
B* b = new D;
b->~B();
为什么派生类的析构函数被调用?它是虚拟的,但是我们按名称调用析构函数,或者是否存在析构函数的隐藏名称,对于所有类都是相同的?
答案 0 :(得分:11)
析构函数本身没有名称。对于类C
,语法~C
用于引用单个无名析构函数。
在您的情况下,~B
因此仅仅意味着“析构函数”。因为它是虚拟的,动态调度在运行时在D
的析构函数中被调用。
如果你这样做了:
b->B::~B();
它会禁用动态调度(就像任何其他合格的调用一样),你只能调用B
的析构函数。