C++相談室 part43
レス数が900を超えています。1000を超えると表示できなくなるよ。
0901デバッグ生活6週間目
2005/09/30(金) 14:19:11考察の足りない小手先の修正をして事態を悪化させることがある。
最近デバッグ中に、某ソフトウェア・ハウスへ数年前に外注したコード中で
この例の反面教師となるようなダメかつ姑息なコードを見つけて
唖然としたので晒しておく。
まずは背景解説。
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。)
レス数が900を超えています。1000を超えると表示できなくなるよ。