基底クラスのコンストラクタで仮想関数を呼んでみた
謎のリンクエラーで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