为什么派生的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
的析构函数。
我有一个简单的程序:
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
的析构函数。