Это не так.Это близко к доказательству того, что деструктор не становится автоматически виртуальным:
#include <iostream>
struct BaseBase {
~BaseBase() {
std::cout << "~BaseBase\n";
}
};
struct Base : BaseBase
{
virtual void foo() = 0;
//~Base(); <-- No destructor!
};
struct Derived : Base {
void foo() { std::cout << "foo\n"; }
~Derived() {
std::cout << "~Derived\n";
}
};
int main() {
Base *p = new Derived();
delete p;
}
Эта программа на самом деле имеет неопределенное поведение, но я строго подозреваю, что в вашей реализации она не печатает "~ Derived».Если бы у Base
был виртуальный деструктор, он не имел бы неопределенного поведения и вывел бы «~ Derived».
Конечно, он на самом деле ничего не доказывает о стандарте.Любая реализация, на которой вы ее запускаете, может в конечном итоге быть несоответствующей.Но как только вы попробуете это на нескольких, вы поймете, что, что бы ни говорил стандарт, вам нужно указать виртуальный деструктор.