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