上級 › 仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由 › パターン2
仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由
基底クラスのポインタ経由で派生クラスのオブジェクトをdeleteしたとき、基底クラスのデストラクタが仮想(virtual)でないと、派生クラス側のデストラクタが呼ばれないバグです。
1 #include <iostream> 2 class Shape { 3 public: 4 ~Shape() { std::cout << "Shape destroyed" << std::endl; } 5 }; 6 class Circle : public Shape { 7 public: 8 ~Circle() { std::cout << "Circle destroyed" << std::endl; } 9 }; 10 int main() { 11 _______ c = new Circle(); ^ 12 delete c; 13 return 0; 14 }
出力: Shape destroyed(Circle destroyedが呼ばれない)期待: Circle destroyed → Shape destroyed
空欄を埋めてコンパイル・実行を通す
仮想関数として宣言されていないメンバ関数の呼び出しは、実行時の実際の型ではなく、ポインタの静的な型を基準に決まります。デストラクタも例外ではありません。
次の問題