Nie. Jest blisko do dowodu, że destruktor nie jest automatycznie wykonane wirtualna:
#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;
}
Ten program rzeczywiście jest zachowanie niezdefiniowane, ale silnie podejrzewa, że na realizację nie drukuje „~ pochodny”. Gdyby Base
miał wirtualny destruktor, nie miałby niezdefiniowanego zachowania i wydrukowałby "~ Derived".
Oczywiście nic nie dowodzi standardu. Każda implementacja, na której ją uruchomisz, może być w końcu niezgodna. Ale gdy już wypróbujesz to na kilku, dostaniesz pomysł, że niezależnie od standardu może powiedzieć, musisz określić wirtualny destruktor.
Nie, ale nie mogę podać odniesienia do czegoś standardowego * nie * powiedzmy ... –
Jeśli tylko kompilatory mogą odpowiadać na pytania dotyczące stackoverflow;) – MerickOWA