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?
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. –