初学者はつい目先のコンパイルエラーの解消に夢中になるあまり
考察の足りない小手先の修正をして事態を悪化させることがある。
最近デバッグ中に、某ソフトウェア・ハウスへ数年前に外注したコード中で
この例の反面教師となるようなダメかつ姑息なコードを見つけて
唖然としたので晒しておく。

まずは背景解説。

class A {
  public:
  A(void) {;}
  //...(omit)
  virtual void v(void)=0;
   //pure virtual function
};

class D : public A {
  D(void) : A() {v();}
   // pure virtual function is called!
  //...(omit)
  void v(void) {/* anything */;}
};

こういうコードはC++では実行結果が不定になる。
(分かりやすく言うと書いちゃだめ。)
仮想関数のセットアップはコンストラクタの実行の
どの段階で行われるか規格は敢えて厳密には決めていないからだ。
仮想関数をコンストラクタ中で呼び出すことはそもそも微妙だが、
特に純粋仮想関数の場合は深刻で、結果は不定だと明示されている。
気の利いたコンパイラなら上掲のコードについてエラーを報告するだろう。
(余談だがJavaのコンストラクタは根本的にC++と動作が違うのでOK。)