仮想デストラクタ
C++ では、コンストラクターはオブジェクトがインスタンス化されるときにのみ呼び出され、仮想関数の実装は実際には仮想関数テーブル ポインターを通じて呼び出され、オブジェクトの更新は行われないため、コンストラクターを架空のコンストラクターとして定義することはできません。もちろん、メモリ空間がなければ呼び出すことはできないため、オブジェクトをインスタンス化する前の架空のコンストラクターは無意味であり、実装できません。
ただし、デストラクターは仮想関数にすることもでき、ほとんどの場合、デストラクターは仮想デストラクターとして宣言されます。このようにして、基底クラス ポインターが指す派生クラスのオブジェクトが解放されると、サブクラスのデストラクターが動的にコンパイルされ、指す実際のオブジェクト タイプに従って呼び出され、正しいオブジェクト メモリ解放が実現されます。 。
以下で実験を行ってみましょう。コードを見てください。
/************************************//デス: C++ チュートリアル デモ//作成者: Huang/ /著作権:www.dotcpp.com//日付:2017/12/27******************************** * *******/#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;}コードを見ると、基底クラスにはvirtualで宣言されたデストラクターはなく、基底クラスと派生クラスの両方に動的メモリ割り当てがあります。次に、動的にメモリを割り当てて main 関数内に Circle クラスを作成し、削除します。実行後のスクリーンショットは次のとおりです。

基本クラスのデストラクターのみが呼び出されるため、派生クラスの 4*100 バイトの新しいメモリが残り、メモリ リークが発生することがはっきりとわかります。
また、基本クラスのデストラクターが仮想として宣言されている場合、結果は大きく異なります。このとき、以下に示すように、ポリモーフィック効果が最初に派生クラスの領域を解放し、次に基本クラスのメモリ領域を解放します。

上記は仮想デストラクターによってもたらされる利点であり、ご自身で体験していただけます。