virtualをつけないと、親クラスのポインタに子クラスを格納しているケースにおいて、親クラスのポインタをdeleteしても親クラスのデストラクタしか呼ばれないため。
// デストラクタにvirtualがついているケース using namespace std; class Parent{ public: virtual ~Parent(){ cout << "Parent::~Parent()" << endl; } }; class Child final: public Parent{ public: ~Child() override{ cout << "Child::~Child()" << endl; } }; int main() { Parent* oya = new Child(); delete oya; return 0; } // 実行結果 Child::~Child() Parent::~Parent()
// デストラクタにvirtualがついていないケース using namespace std; class Parent{ public: ~Parent(){ cout << "Parent::~Parent()" << endl; } }; class Child final: public Parent{ public: ~Child(){ cout << "Child::~Child()" << endl; } }; int main() { Parent* oya = new Child(); delete oya; return 0; } // 実行結果 Parent::~Parent()
こういったミスを犯さないポイントとして、子クラスのデストラクタ定義時に、overrideを付与する癖をつけておけば、親のデストラクタにvirtualがついていなければコンパイルエラーになるので気づきやすい。
コメントを残す