コンストラクタから仮想関数を呼ぶ

C#の場合、オーバーライドされたメソッドが呼び出されます。C++出身の私としては違和感がありますが、ふと、C++/CLIだとどーなるか気になりました。

#include <stdio.h>

ref class Foo {
public:
    Foo () {
        Hoge ();
    } 

    virtual void Hoge () {
        printf ("Foo.Hoge\n");
    }
};

ref class Bar : public Foo {
public:
    virtual void Hoge () override {
        printf ("Bar.Hoge\n");
    }
};

void main () {
    Bar bar;
}

/* 
 Bar.Hoge
 */

C#と同じ。ただ、FxCopも注意するように、コンストラクタで仮想関数を呼び出すとオーバーライドした仮想関数はオブジェクトの初期化が終わっているかどうか分からない状態で処理を行うことになってしまうので避けるべき書き方ですね。