Wenn ich eine Klasse in C ++ überschreibe (mit einem virtuellen Destruktor), implementiere ich den Destruktor erneut als virtuell für die erbende Klasse, aber muss ich den Basisdestruktor aufrufen?
Wenn ja, stelle ich mir das so vor ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Habe ich recht?
c++
destructor
Nick Bolton
quelle
quelle
delete
eines Zeigers auf die Basisklasse einen Segmentierungsfehler verursacht?Nein, Sie müssen den Basis-Destruktor nicht aufrufen. Ein Basis-Destruktor wird vom abgeleiteten Destruktor immer für Sie aufgerufen. Die Reihenfolge der Zerstörung finden Sie in meiner entsprechenden Antwort hier .
Um zu verstehen, warum Sie einen virtuellen Destruktor in der Basisklasse möchten, lesen Sie bitte den folgenden Code:
Wenn Sie das tun:
Wenn Sie dann keinen virtuellen Destruktor in B hätten, würde nur ~ B () aufgerufen. Da Sie jedoch einen virtuellen Destruktor haben, wird zuerst ~ D () und dann ~ B () aufgerufen.
quelle
Was die anderen gesagt haben, aber auch beachten, dass Sie den Destruktor in der abgeleiteten Klasse nicht als virtuell deklarieren müssen. Sobald Sie einen Destruktor virtuell deklarieren, wie Sie es in der Basisklasse tun, sind alle abgeleiteten Destruktoren virtuell, unabhängig davon, ob Sie sie deklarieren oder nicht. Mit anderen Worten:
quelle
Nein. Im Gegensatz zu anderen virtuellen Methoden, bei denen Sie die Base-Methode explizit aus der Ableitung aufrufen würden, um den Aufruf zu "verketten", generiert der Compiler Code, um die Destruktoren in der umgekehrten Reihenfolge aufzurufen, in der ihre Konstruktoren aufgerufen wurden.
quelle
Nein, Sie nennen den Basisklassen-Destruktor nie, er wird immer automatisch aufgerufen, wie andere darauf hingewiesen haben, aber hier ist ein Proof of Concept mit Ergebnissen:
Die Ausgabe ist:
Wenn Sie den Destruktor der Basisklasse als virtuell festlegen, was der Fall sein sollte, stimmen die Ergebnisse von Fall 3 mit denen von Fall 1 und 2 überein.
quelle
Nein, es wird automatisch aufgerufen.
quelle
Destruktoren in C ++ werden automatisch nur dann in der Reihenfolge ihrer Konstruktionen (Abgeleitet, dann Basis) aufgerufen, wenn der Destruktor der Basisklasse deklariert ist
virtual
.Wenn nicht, wird zum Zeitpunkt des Löschens des Objekts nur der Basisklassen-Destruktor aufgerufen.
Beispiel: Ohne virtuellen Destruktor
Ausgabe
Beispiel: Mit Base Virtual Destructor
Ausgabe
Es wird empfohlen, den Basisklassen-Destruktor zu deklarieren, da dies
virtual
sonst zu undefiniertem Verhalten führt.Referenz: Virtueller Destruktor
quelle