派生クラスのオブジェクトを破棄するときに「仮想デストラクタを持たない基底クラス」のポインタをdeleteするとその結果は未定義になる。よくある結果は基底クラス部分のみ破棄されたオブジェクトが残ることになる。基底クラスに仮想デストラクタを与えると基底クラスのポインタにdeleteを適用してもそのポインタが指し示す実際のオブジェクトが破棄されることになる。
一方で仮想関数を宣言すると仮想テーブルが実装されその分の領域が必要になるためむやみやたらと仮想デストラクタを宣言するのは避けるべきである。結局のところ
- ポリモーフィズムのための基底クラスには仮想デストラクタを宣言する。特にクラスが仮想関数を持つ場合は仮想デストラクタも持たせる。
- 基底クラスとしてデザインされていないクラスやポリモーフィズムを想定していないクラスは仮想デストラクタを宣言すべきではない。
になる。
参考文献
Effective C++ 第3版, スコット・メイヤーズ著