上級 › 仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由 › パターン3
仮想デストラクタが無いと派生クラスのデストラクタが呼ばれない理由
基底クラスのポインタ経由で派生クラスのオブジェクトをdeleteしたとき、基底クラスのデストラクタが仮想(virtual)でないと、派生クラス側のデストラクタが呼ばれないバグです。
1 #include <iostream> 2 class Resource { 3 public: 4 ~Resource() { std::cout << "Resource destroyed" << std::endl; } 5 }; 6 class FileHandle : public Resource { 7 public: 8 ~FileHandle() { std::cout << "FileHandle destroyed" << std::endl; } 9 }; 10 int main() { 11 ___________ f = new FileHandle(); ^ 12 delete f; 13 return 0; 14 }
出力: Resource destroyed(FileHandle destroyedが呼ばれない)期待: FileHandle destroyed → Resource destroyed
空欄を埋めてコンパイル・実行を通す
「deleteすればそのオブジェクトの型に応じたデストラクタが正しく呼ばれる」というのは誤解です。実際に呼ばれるファイルクローズ処理などが仮想デストラクタなしでは実行されず、リソースリークの原因になります。
次の問題