Warum sollte man Destruktoren virtuell machen?
-
Ich habe neulich gelesen, dass man Destruktoren virtuell machen sollte. Das ergibt doch keinen Sinn, oder???
-
Das ergibt doch keinen Sinn, oder???
doch
-
Natürlich macht das Sinn: Wenn ein Zeiger einer Basisklasse auf ein Objekt einer Derived-Klasse zeigt und auf diesen ein delete ausgeführt wird sind nur die Methoden von der Basisklasse sichtbar. Dies hat zur Folge, dass möglicherweise zuwenig Speicherplatz freigegeben wird, weil der falsche Dtor aufgerufen wurde. Deswegen sollte man Destruktoren von Basisklassen immer virtuell machen.
-
Dies hat zur Folge, dass möglicherweise zuwenig Speicherplatz freigegeben wird, weil der falsche Dtor aufgerufen wurde
Nein. Das hat zur Folge, dass das Verhalten des Programms undefiniert ist. Bei vielen Implementationen heißt das in diesem Fall nur, dass der Derived-Dtor nicht aufgerufen wird. Darauf würde ich mich aber nicht verlassen.
Ich habe neulich gelesen, dass man Destruktoren virtuell machen sollte.
Das kommt immer darauf an. Für Value-Klassen die nicht als Basisklasse gedacht sind (wie z.B. eine String-Klasse), wäre ein virtueller Dtor humbug. Für Klassen die von Anfang an als Basisklassen geplant sind ist ein virtuelle Dtor plicht.
Sobald eine Klasse mindestens eine virtuelle Methode besitzt, sollte man den Dtor ebenfalls virtuell machen.