virtuelle Destruktoren
Für den Fall, daß man einen Array von Zeigern auf Objekte oder eine
Liste von Klasseinobjekten einer
Klasse und ihrer abgeleiteten Klassen erzeugt, kann es bei der Destruktion
der Objekte zu Problemen kommen, da nicht der richtige Destruktor aufgrufen
wird:
class family { family(); ~family() { cout << "~family";} };
class daughter : family { daughter(); ~daughter(){ cout << "~daughter;} };
class son : family { son(); ~son() { cout << "~son";} };
family* fam[10]; // Array aus 10 fam-Zeigern
fam[1] = new family;
fam[2] = new son;
fam[3] = new daughter;
delete fam[1]; // Ausgabe : ~family
delete fam[2]; // Ausgabe : ~family !!
delete fam[3]; // Ausgabe : ~family !!
Es wird also nicht der "richtige" Destruktor aufgerufen, da es sich
um einen family Array handelt. Dieses Problem umgeht man, in dem die
Destruktoren virtuell gemacht verden. Hier genügt es den Destruktor
der Basisklasse als virtual zu deklarieren. Die Destruktoren der
abgeleiteten Klassen sind dann automatisch virtuell
.
class family { family(); ~family() { cout << "~family";} };
delete fam[1]; // Ausgabe : ~family
delete fam[2]; // Ausgabe : ~daughter
delete fam[3]; // Ausgabe : ~son