考虑下面的代码

#include <cstdio>
#include <memory>

struct Base1
{
    Base1() = default;
    virtual ~Base1() = default;
    //~Base1() = default;
};

struct Base2 : public Base1
{
    Base2()
    {
        printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
    }
    ~Base2() // non-virtual destructor
    {
        printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
    }
};

struct Derive : public Base2
{
    Derive()
    {
        printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
    }
    ~Derive()
    {
        printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
    }
};

int main()
{
    std::unique_ptr<Base2> d = std::make_unique<Derive>();
    return 0;
}

Base2没有虚拟析构函数,但是它继承了具有虚拟析构函数的Base1

代码std::unique_ptr<Base2> d = std::make_unique<Derive>();试图删除Base2类型的对象上的Derive,我期望只调用Base2的dtor,而不是Derive

但实际上它可以正常工作:
main.cpp:15:Base2
main.cpp:27:Derive
main.cpp:31:~Derive
main.cpp:19:~Base2

因此,看起来只要“真实”基类(此处为Base1)具有虚拟dtor,就不需要所有继承的类都具有虚拟dtor,对吗?
如果是,我在哪里可以找到与此相关的文档?

最佳答案

是的,如果一个类的基类的destructor声明为virtual,则其析构函数也将为virtual;不管是否明确将其声明为virtual



从标准[class.dtor]/13

(强调我的)

09-07 02:05