基底クラスのコンストラクタで仮想関数を呼んでみた

謎のリンクエラーで1日潰れたorz

class A
{
public:
	A(){
		Test();
	}
protected:
	virtual void Test() = 0;
};

class B:public A
{
public:
	B():A(){}
protected:
	virtual void Test(){ std::cout << "B" << std::endl; }
};

int main()
{
	B b;
}

このソース、"Test()は未解決"というリンクエラーが返ってくる。理由がさっぱり分からずためしに基底クラス側も実装してみた

class A
{
public:
	A(){
		Test();
	}
protected:
	virtual void Test(){ std::cout << "A" << std::endl; }  // ← new!!
};

そしたらビルドが通った。しかし走らせて見たら"B"が表示されると思ったら"A"が呼ばれた。
え、ひょっとして、コンストラクタ内ではオーバライド関数を呼べない?それともVisualStudioの方言?と思ってgccでも試したが結果は同じでした。


それなりにC++経験長いつもりでしたが知りませんでしたorz