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

Why is the destructor of the derived class called?

我有一个简单的程序:

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

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

所以,当我打电话给

B* b = new D;

b->~B();

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

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

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

如果您这样做:

b->B::~B();

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