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)