上級 › 仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由 › パターン1
仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由
基底クラスのポインタ経由で派生クラスのオブジェクトをdeleteしたとき、基底クラスのデストラクタが仮想(virtual)でないと、派生クラス側のデストラクタが呼ばれないバグです。
1 #include <iostream> 2 class Base { 3 public: 4 ~Base() { std::cout << "Base destroyed" << std::endl; } 5 }; 6 class Derived : public Base { 7 public: 8 ~Derived() { std::cout << "Derived destroyed" << std::endl; } 9 }; 10 int main() { 11 ________ b = new Derived(); ^ 12 delete b; 13 return 0; 14 }
出力: Base destroyed(Derived destroyedが呼ばれない)期待: Derived destroyed → Base destroyed
空欄を埋めてコンパイル・実行を通す
Baseのデストラクタがvirtualでないため、Base*経由でのdeleteはBaseのデストラクタしか呼びません。ポインタの型をDerived*にすれば正しい型のデストラクタから呼ばれます(本来の解決策はBaseのデストラクタをvirtualにすることです)。
次の問題