Virtuelle Destruktoren
-
Ich habe mich gerade gefragt, ob ein virtueller Destruktor in einer Vererbungskette reicht. Offensichtlich tut er das:
class A { public: virtual ~A() { std::cout << "A\n"; } }; class B : public A { public: ~B() { std::cout << "B\n"; } }; class C : public B { public: ~C() { std::cout << "C\n"; } }; int main() { B* b = new C; delete b; }Hier wird A, B, und C ausgegeben. Warum ist das so? Ich hätte erwartet, dass ich den Destruktor von B auch virtual machen muss.
Vielen Dank für eure Hilfe.
-
Wenn der Destruktor einer Basisklasse virtual ist, ist es auch der Destruktor aller von ihr abgelittenen Klassen; du musst es in diesen dann nicht mehr explizit hinschreiben. Der Zeiger in der vtbl muss ja sowieso entsprechend gesetzt werden, für den Fall, dass das Ding mal als Basisklasse& benutzt wird.
Das gilt übrigens für alle virtuellen Funktionen, nicht nur für den Destruktor.
-
Danke, du hast mir sehr geholfen. Ist es dann bevorzugter Stil, das virtual trotzdem immer hinzuschreiben (auch in Hinblick auf normale Funktionen), oder lässt man das lieber weg?
-
umpf schrieb:
Danke, du hast mir sehr geholfen. Ist es dann bevorzugter Stil, das virtual trotzdem immer hinzuschreiben (auch in Hinblick auf normale Funktionen), oder lässt man das lieber weg?
Hättest du nach dem Verhalten fragen müssen, wenn bei der erbenden Klasse ein virtual stünde?
Ein Weglassen verbirgt ja nur (interessante) Informationen.
-
seldon schrieb:
abgelittenen Klassen;
Wir leiden mit.