Anzeigen: Delphi
C++
Anzeigeeinstellungen
Virtuelle Destruktoren
Aus RAD Studio XE2
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.