Destruktor bei vererbung
-
Hallo kurze Frage muss ich einen virtuellen Destruktor schreiben wen die Klasse weiter vererbt wird ?
class A { }; class B : public A { };
Auch wen ich in der Basisklasse keinen Konstruktor und Destruktor brauche.
-
Schau mal hier: http://www.willemer.de/informatik/cpp/cppvirt.htm
oder hier: http://de.wikipedia.org/wiki/Virtuelle_Methode
-
Ja, der Destruktor muss virtual sein wenn du eine Klasse als Basisklasse verwenden willst. Es kannst sonst passieren, dass nur der Destruktor der Basisklasse augerufen wird und der Destruktor der abgeleiteten Klasse nicht.
Als Beispiel:
class A { public: ~A() { cout << "Destructor in A called" << endl; } }; class B : public A { public: ~B() { cout << "Destructor in B called" << endl; } }; int main () { A* a = new B; delete a; // Es wird nur der Destruktor von A aufgerufen }
Natuerlich ist das schlecht, wenn der Destruktor von B nicht aufgerufen wird, da dies normalem Verhalten widerspricht.
Wenn du den Destruktor von A virtual machst klappts.
-
icarus2 schrieb:
Ja, der Destruktor muss virtual sein wenn du eine Klasse als Basisklasse verwenden willst.
Muss ist hier eine ziemlich starke Aussage.
Gerade dein Beispiel ist ein Fall, wo es total egal ist, da B keine Member hat. Und eine Klasse ohne virtuelle Funktionen über einen Basisklassenzeiger zu löschen ist auch sehr ungewöhnlich.
-
SeppJ schrieb:
icarus2 schrieb:
Ja, der Destruktor muss virtual sein wenn du eine Klasse als Basisklasse verwenden willst.
Muss ist hier eine ziemlich starke Aussage.
Gerade dein Beispiel ist ein Fall, wo es total egal ist, da B keine Member hat. Und eine Klasse ohne virtuelle Funktionen über einen Basisklassenzeiger zu löschen ist auch sehr ungewöhnlich.
Ich wollte mit meinem Beispiel vor allem aufzeigen, dass jenachdem der Destruktor von B nicht aufgerufen wird. Die Klassen sind so wie sie dastehen onehin sinnlos.
Aber vielleicht eine etwas genauere und abgeschwaechtere Formulierung:
In polymorphen Basisklassen sollte man den Destruktor als virtual deklarieren. Eigentlich finde ich es ein muss auch wenn einem niemand dazu zwingt.
-
Entweder public und virtuell, oder protected und nicht virtuell.