コンストラクタからの仮想関数呼び出しはNG
○コンストラクタから仮想関数を呼び出す
仮想関数がオーバーライドされているときに、スーパークラスのポインタから、その関数を呼び出せば、多態性によって、 サブクラス側の関数が呼び出されます。しかし、コンストラクタ内から仮想関数を呼び出す場合には、多態性の性質は 現れず、そのコンストラクタが定義されているクラス自身のメンバ関数が呼び出されます。
もし、コンストラクタ内で仮想関数を呼び出したときに、サブクラス側の関数が呼び出されてしまうと問題が起こる ことがあるため、このような仕組みになっています。継承関係にある2つのクラスの、コンストラクタが呼び出される 順序を思い出して下さい。スーパークラス→サブクラス の順番でした。つまり、スーパークラス側のコンストラクタ が呼び出された時点では、まだサブクラス側はコンストラクタが呼び出されていません。よって、まだメンバ変数の 準備ができていない状態なのです。サブクラスがオーバーライドした関数が、サブクラスのメンバ変数をアクセスして いると問題になります。
http://www.geocities.jp/ky_webid/cpp/language/009.html
これってどういうこと言ってるんだろ。こんな感じかな?
class Hoge { public: Hoge() { reinterpret_cast<HogeInher*>(this)->hoge(); // とか HogeInher::hoge(); // こいつがstaticだとして // とか? } virtual void hoge(){} }; class HogeInher : public Hoge { public: void hoge(){} }; int main() { HogeInher a; return 0; }
こんなことやる人いんのかな・・・。