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

5

我有一个简单的程序:

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

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

所以,当我调用

时,该怎么办?
B* b = new D;

b->~B();

为什么会调用派生类的析构函数?虽然我们通过名称来调用析构函数,但它是虚函数。是否存在一个隐藏的析构函数名称,对于所有的类都相同呢?
1个回答

11

析构函数本身没有名字。对于一个类 C,语法 ~C 被用来代表这个单一的、无名的析构函数。

在你的情况中,~B 简单地表示“析构函数”。由于它是虚拟的,所以在运行时会发生动态调度,并调用 D 的析构函数。

如果你做了这个:

b->B::~B();

这将禁用动态分派(就像任何其他限定调用一样),并且您只会调用 B 的析构函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接