Рассмотрим код ниже
#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
, но не для Derive
.
Но на самом деле все работает нормально:
main.cpp:15:Base2
main.cpp:27:Derive
main.cpp:31:~Derive
main.cpp:19:~Base2
Так что, если у «реального» базового класса (здесь Base1
) есть виртуальный dtor, то все унаследованные классы не обязательно должны иметь виртуальный dtor, не так ли?Если да, где я могу найти соответствующий документ об этом?