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

use*_*289 5 c++ polymorphism inheritance destructor virtual-functions

我有一个简单的程序:

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

struct D : public B
{
    ~D() {}
};
Run Code Online (Sandbox Code Playgroud)

所以,当我打电话的时候

B* b = new D;

b->~B();
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 11

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

在你的情况下,~B因此只是意味着"析构者".因为它是虚拟的,动态调度在运行时在D被调用的析构函数中发生.

如果你这样做了:

b->B::~B();
Run Code Online (Sandbox Code Playgroud)

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