3

Fooと呼ばれる抽象メソッドを持つ抽象基本クラスがありbarます。のコンストラクターbarから呼び出しています。Foo私は、サブクラスがオーバーライドしbar(結局は抽象的です)、すべてのインスタンスFooでオーバーライドされたものを呼び出すことを期待しています:bar

class Foo
{
    public:
        Foo() { bar(); }
        virtual void bar() = 0;
}

ただし、エラーが発生します。

foo.obj:-1: error: LNK2019: unresolved external symbol "protected: virtual void __cdecl Foo::bar(void)" (?bar@Foo@@MEAAXXZ) referenced in function "public: __cdecl Foo::Foo(void)" (??0Foo@@QEAA@XZ)

この種のリンカ エラーは、通常、何かを定義したが宣言していない (またはその逆) ことを意味します。bar次のような定義を追加すると、すべてがうまく機能します。

void Foo::bar() {}

これは意図したエラーですか、それともリンカのバグですか? 意図的だとしたら、それはなぜですか?コンストラクターから抽象メソッドを呼び出せなかった理由がわかりません。私が考える唯一の理由は、サブクラスのメソッドが定義される前に基本クラスのコンストラクターが呼び出されることですが、それでもこのエラーが発生する必要はないと思いますか?

私は使用していますQt Creator 2.7.0 - Based on Qt 5.0.2 (32 bit)

4

2 に答える 2