class 需要既是派生又是基础的虚拟析构函数?

Virtual destructor needed for class which is both derived and base?

假设我们有以下内容:

#include <iostream>

struct A
{
    virtual ~A() { std::cout << "destr A\n"; }
};

struct B : A
{
    // no need to be virtual?
    ~B() { std::cout << "destr B\n"; }
};

struct C : B
{
    ~C() { std::cout << "destr C\n"; }
};

现在,我创建了一个 C 的实例并将其分配给其基数 class B.

的指针
int main()
{
    B* b = new C{};
    delete b;
    return 0;
}

输出为:

destr C
destr B
destr A

让我有点惊讶的是对象被正确销毁了(调用了所有三个析构函数)。根据输出,我会说 ~B() 是一个虚拟析构函数:~B() 分派到 ~C(),然后 ~B() 完成,最后 ~A() 被调用。这个说法正确吗?

我知道,如果基 class 的某些函数是虚拟的,则派生 class 中覆盖基 class 中的函数的函数也是虚拟的。我不知道析构函数也是如此。 ~B() 是虚拟的,因为我用 virtual 函数说明符声明了 ~A() 吗?

Is ~B() virtual because I declared ~A() with the virtual function specifier?

是的。每 https://timsong-cpp.github.io/cppwp/n4659/class.dtor#10:

If a class has a base class with a virtual destructor, its destructor (whether user- or implicitly-declared) is virtual.