Virtuelle Destruktoren

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Siehe auch