virtueller Destruktor
In C++ kann der Konstruktor nicht als fiktiver Konstruktor definiert werden, da der Konstruktor nur aufgerufen wird, wenn ein Objekt instanziiert wird, und die Implementierung der virtuellen Funktion tatsächlich über einen Zeiger der virtuellen Funktionstabelle aufgerufen wird und keine Objektaktualisierung erfolgt Natürlich kann es nicht ohne Speicherplatz aufgerufen werden, daher ist der fiktive Konstruktor vor der Instanziierung eines Objekts bedeutungslos und kann nicht implementiert werden.
Destruktoren können jedoch virtuelle Funktionen sein und werden in den meisten Fällen als virtuelle Destruktoren deklariert. Wenn auf diese Weise das Objekt der abgeleiteten Klasse, auf die der Basisklassenzeiger zeigt, freigegeben wird, kann der Destruktor der Unterklasse entsprechend dem tatsächlichen Objekttyp, auf den gezeigt wird, dynamisch kompiliert und aufgerufen werden, um die korrekte Freigabe des Objektspeichers zu erreichen .
Lassen Sie uns unten ein Experiment durchführen. Schauen Sie sich bitte den Code an:
/****************************************//Des: C++-Tutorial-Demo//Autor: Huang/ /Copyright:www.dotcpp.com//Datum:27.12.2017*********************************** * *******/#include<iostream>usingnamespacestd;classPoint{private:intx,y;int*str;public:Point(intx=0,inty=0){this->x=x;this- > y=y;str=newint[100];}~Point(){delete[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public : Circle(intx,inty,intR):Point(x,y){r=R;str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl; } };intmain(){Point*p;p=newCircle(10,10,20);deletep;return0;}
Sie können den Code sehen. In der Basisklasse ist kein Destruktor mit Virtual deklariert, und sowohl die Basisklasse als auch die abgeleitete Klasse verfügen über eine dynamische Speicherzuweisung. Anschließend erstellen wir eine Circle-Klasse in der Hauptfunktion, indem wir Speicher dynamisch zuweisen und dann löschen Der Screenshot nach dem Ausführen sieht wie folgt aus:
Es ist deutlich zu erkennen, dass nur der Destruktor der Basisklasse aufgerufen wird, sodass die 4 * 100 Bytes neuen Speichers in der abgeleiteten Klasse verbleiben, was zu einem Speicherverlust führt!
Und wenn der Destruktor in der Basisklasse als virtuell deklariert wird, wird das Ergebnis ganz anders ausfallen! Zu diesem Zeitpunkt tritt der polymorphe Effekt auf, der zuerst den Speicherplatz der abgeleiteten Klasse und dann den Speicherplatz der Basisklasse freigibt. Dies endet perfekt, wie unten gezeigt:
Oben sind die Vorteile des virtuellen Destruktors aufgeführt, Sie können ihn selbst erleben.