2016-04-21 14 views
-1

Ich verstehe, dass wenn wir den Destruktor unseres abgeleiteten Objekts aufrufen möchten, das einem Zeiger auf Base zugewiesen wurde, wir den Basisdestruktor als virtuell machen möchten. Allerdings, wenn wir so etwas wie dieses hatte:Virtueller Destruktor C++

#include <iostream> 
using namespace std; 
class base 
{ 

public: 
base() { cout << "Base Constructor Called\n"; } 
virtual ~base() { cout << "Base Destructor called\n"; } 

}; 
class derived1 :public base 
{ 

public: 
derived1() { cout << "Derived1 constructor called\n"; } 
~derived1() { cout << "Derived1 destructor called\n"; } 

}; 

class derived2 : public derived1 
{ 
public: 
derived2() { cout << "Derived2 constructor called\n"; } 
~derived2() { cout << "Derived2 destructor called\n"; } 

    }; 

class derived3 : public derived2 
{ 
    public: 
derived3() { cout << "Derived3 constructor called\n"; } 
~derived3() { cout << "Derived3 destructor called\n"; } 

}; 

und wir haben die Hauptfunktion wie folgt aus:

int main(){ 
base* ptr=new derived3; 
delete ptr; 

und der Ausgang ist:
Base Constructor Called Derived1 constructor called Derived2 constructor called Derived3 constructor called Derived3 destructor called Derived2 destructor called Derived1 destructor called Base Destructor called

dies nennt Basis, Derived1, derived2 und derived3 Destruktoren, die gut funktionieren. Wir haben den Basisdestruktor nur als virtuell gemacht.
Warum ist es nicht notwendig, derived1 und derived2 Destruktoren als virtuell zu machen, um die gleichen Ergebnisse zu erzeugen?

+3

Ich [diese Antwort] (http://stackoverflow.com/a/36760987/440558) nur vor ein paar Stunden, mit Zitaten aus der C++ - Spezifikation, die sagt, warum es nicht für die Kind-Klassen benötigt wird. Das letzte Zitat ist das, das du lesen solltest. Das gleiche gilt für * all * member-Funktionen, wenn eine Basisklasse sie als virtuell deklariert, dann ist sie auch in allen untergeordneten Klassen virtuell. –

Antwort

2

Alle Klassen, die von einer Klasse mit einem virtuellen Destruktor abgeleitet sind, haben implizit virtuelle Destruktoren.

Dies gilt für jede Elementfunktion in Ihrer Klassenhierarchie.

+0

Nehmen wir an, wir speichern ein Objekt von derived3 mit ** derived1 ** Zeiger, der kein explizit deklariertes virtuelles dtor hat. Wird dann die Basisklasse dtor von ** delete ** aufgerufen? –

+0

@AndrewLavq Diese Antwort sagt "Ja". – juanchopanza

2

Sobald Sie eine Funktion als virtual deklarieren, bleibt sie implizit in allen abgeleiteten Klassen virtual.

+0

Gilt das nicht nur für den Destruktor? – Rotem

+0

@Rotem nein! :) – Quentin

+0

Interessant, ich weiß nicht, warum ich angenommen habe, dass das Weglassen von 'virtual' auf eine überschriebene Methode in einer abgeleiteten Klasse die Methode versiegeln würde. – Rotem