純粋仮想デストラクタを持つ抽象クラスを定義する場合、抽象クラスでデストラクタの定義を与える必要があるのはなぜですか?
4 に答える
基本クラスのデストラクタは、オブジェクトが破棄されるときに呼び出される必要があるため、定義が必要です。
標準がそう言っているので:
12.4.7デストラクタは仮想 (10.3) または純粋仮想 (10.4) として宣言できます。そのクラスまたは派生クラスのオブジェクトがプログラムで作成された場合、デストラクタが定義されます。
これは、派生クラスのオブジェクトが破棄されるときに明示的に呼び出されるためです。
私の以前の質問への回答も参照してください:純粋仮想関数の実装を提供することは、どのような状況下で有利ですか?
Jesse が指摘したように、継承されたデストラクタは常に呼び出されます (コンパイラによって呼び出され、この動作をオーバーライドする方法はありません)。そのため、仮想デストラクタに実装が必要なのは理にかなっています。では、純粋仮想デストラクタに実装が必要な場合、純粋仮想デストラクタと通常の仮想デストラクタの違いは何ですか? 抽象クラスに宣言された仮想デストラクタのみがあり、他の純粋仮想メソッドがない場合、デストラクタを純粋にすると、誰かが抽象クラスをインスタンス化できなくなります。
純粋として宣言できるのは仮想dtorのみです。ただし、宣言を追加するため、dtorの本体を実装する必要があります。すでに述べたように、デストラクタは、すべて継承のチェーンまで、親dtorを呼び出します。