コンストラクタとデストラクタと実行時型情報と仮想関数

Effective C++は、いい。
プログラマ」向けだ。


起きてきて読んでたら
仮想関数のオーバーライドはコンストラクタ・デストラクタでは無効になる。なぜなら基底クラスから派生クラスの順番でコンストラクタが呼ばれるため、まだ派生クラスのメンバ変数が初期化されておらず、基底クラスの生成中に仮想関数で派生クラスの関数を呼ぶことは深夜のデバッグ作業への急行切符だから(シャドウゲイトを思い出したら末期)。デストラクタは派生クラスから順に呼び出され、基底クラスのが呼び出されたときにはすでに派生クラスのメンバは破棄されているのでこれもダメ。RTTIもダメ。


・・・ん?
身に覚えがある。
自作の出力にクラス名・ファイル名・行番号をつけた例外クラスのコンストラクタでtypeid(*this)してやがる。
なんで動いてたんだろう・・・。
VC++・・・。


高1の時にはC++オブジェクト指向、特にポリモーフィズム使って結構な規模のゲーム作ってたしなあ・・・。よくはまらんかったな・・・。


参照: Effective C++ 9項