2008-03-05

Effective C++ 7項

7項 ポリモーフィズムのための基底クラスには仮想デストラクタを宣言しよう

言われてみれば当たり前なんですが、基底クラスのデストラクタが仮想関数でない場合、基底クラスのポインタで派生クラスをdeleteすると動作が未定義になってしまうそうです。

基底クラス部分だけ破棄されて派生クラス部分は破棄されずにリソース漏れを起こしてしまう事が多いそうな。

C++には派生を防ぐ手段がないため、仮想関数でないデストラクタを持ったクラスの派生クラスを作る事が出来ますが、これはやってはいけない事らしい。

だったらデストラクタが仮想関数じゃないクラスを派生しようとしたらコンパイルエラーにして欲しいよなぁ…

ちなみに全てのクラスのデストラクタを仮想関数にしてよいかと言うと、クラスのメモリサイズが大きくなってしまうので、継承させないつもりのクラスはデストラクタを仮想関数にしないという選択もありなんだそうな。

C++ってやっぱり難しい言語ですね〜

0 件のコメント: