Virtuelle Destruktoren
Nach oben zu Destruktoren - Index
Ein Destruktor kann als virtual deklariert werden. Dies erlaubt es einem Zeiger auf ein Basisklassenobjekt, den richtigen Destruktor aufzurufen, wenn der Zeiger gerade auf ein abgeleitetes Klassenobjekt weist. Der Destruktor einer Klasse, die von einer Klasse mit einem virtuellen Destruktor abgeleitet ist, ist selbst virtuell.
/* Der folgende Programmteil demonstriert die Wirkung des virtual-Attributs auf
die Reihenfolge der Destruktor-Aufrufe. Ohne die Deklaration eines virtuellen
Destruktors in der Basisklasse würde der Destruktor der abgeleiteten Klasse
nicht aufgerufen werden. */
#include <iostream>
class color {
public:
virtual ~color() { // virtueller Destruktor
std::cout << "color dtor\n";
}
};
class red : public color {
public:
~red() { // Destruktor für Rot ist auch virtuell
std::cout << "red dtor\n";
}
};
class brightred : public red {
public:
~brightred() { // Destruktor ist auch virtuell
std::cout << "brightred dtor\n";
}
};
int main()
{
color *palette[3];
palette[0] = new red;
palette[1] = new brightred;
palette[2] = new color;
// Die Destruktoren für red und color werden aufgerufen
delete palette[0];
std::cout << std::endl;
// Die Destruktoren für bright red, red und color werden aufgerufen.
delete palette[1];
std::cout << std::endl;
// Der Destruktor von color wird aufgerufen.
delete palette[2];
return 0;
}
Programmausgabe:
red dtor
color dtor
brightred dtor
red dtor
color dtor
color dtor
Wurden keine Destruktoren als virtuell deklariert, rufen delete palette[0], delete palette[1] und delete palette[2] nur den Destruktor für die Klasse color auf. Dadurch würden aber die ersten zwei Elemente, die in Wirklichkeit vom Typ red und brightred sind, nicht korrekt gelöscht.