Я написал этот тестовый код, который использует три типа: struct One
- это обычный тип без виртуальных членов, struct Two : One
имеет чисто виртуальную функцию и виртуальный деструктор, а struct Three : Two
реализует Two
. интерфейс.
#include <iostream>
struct One
{
~One() {
std::cout << "~One()\n";
}
};
struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}
virtual void test() = 0;
};
struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}
virtual void test() {
std::cout << "Three::test()\n";
}
};
int main()
{
Two* two = new Three;
two->test();
One* one = two;
delete one;
}
Неудивительно, что вывод был это:
Три :: тест ()
~ One ()
Есть ли способ исправить это, кроме как сделать виртуальный каждый деструктор? Или программисты должны быть осторожны, чтобы не столкнуться с этой ситуацией? Я нахожу странным, что нет никаких предупреждений при компиляции.