コンストラクタ内で仮想関数を呼び出し「派生クラスの関数」が実行されてしまうと、その派生クラスの初期化前のデータメンバを使ってしまう可能性があるため基底クラスのオブジェクトが生成されている間、仮想関数は「派生クラスの関数」として働かないようになっている。つまり、基底クラスに仮想関数の定義がある場合は基底クラスの仮想関数が使われるので「派生クラスを生成したのになぜ基底クラスの関数が呼び出されるのだろう」と悩むことになる。デストラクタについても同様で、コンストラクタ/デストラクタ内で仮想関数を呼び出すのは避けるべきである。
参考文献
Effective C++ 第3版, スコット・メイヤーズ著