为什么派生类的析构函数被调用?

时间:2015-07-01 08:07:58

标签: c++ inheritance polymorphism destructor virtual-functions

我有一个简单的程序:

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

struct D : public B
{
    ~D() {}
};

所以,当我打电话

B* b = new D;

b->~B();

为什么派生类的析构函数被调用?它是虚拟的,但是我们按名称调用析构函数,或者是否存在析构函数的隐藏名称,对于所有类都是相同的?

1 个答案:

答案 0 :(得分:11)

析构函数本身没有名称。对于类C,语法~C用于引用单个无名析构函数。

在您的情况下,~B因此仅仅意味着“析构函数”。因为它是虚拟的,动态调度在运行时在D的析构函数中被调用。

如果你这样做了:

b->B::~B();

它会禁用动态调度(就像任何其他合格的调用一样),你只能调用B的析构函数。