Effective C++ Item 9 ― 2009年07月25日 12時38分52秒
- 仮想関数はコンストラクタとデストラクタの中では呼んではいけない。コンストラクタ内の仮想関数は初期化の終わった派生クラスまでの深さまでしか呼ばれず、デストラクタ内の仮想関数は、既に破壊されたクラスの関数まで追う事が出来ない。
Java や C# 等の言語ではこれらの行為は有効だが、C++ では行なってはいけない。C++ では、オブジェクトが生成されている間、派生クラスが完全に生成される前は、メンバ変数が初期化されていない可能性がある。初期化されていない値にアクセスするのを避ける為、完全に初期化されていないクラスにアクセス出来ないために、仮想関数を用いたときは基底クラスの関数のみが呼ばれることになる。この様なバグを見つけるのは大変な作業になる。
もしこの様な事を行なう必要があれば、静的関数などを用いて代用する。
最近のコメント