我有一个抽象基类Foo
,其中有一个名为bar
的抽象方法。
我从Foo
的构造函数中调用bar
。我期望子类覆盖bar
(毕竟它是抽象的),然后在每个实例上调用覆盖的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 - 基于 Qt 5.0.2 (32 bit)
Foo
的對象,因此我必須有一個子類,其中已定義了bar
,讓我們稱之為SubFoo
。現在假設SubFoo *sf = new SubFoo;
顯然是一個SubFoo
對象,其中已定義了bar
。因此,我不明白為什麼不能從Foo
的構造函數中調用bar
,因為它始終被定義。 - user2032433bar();
? - user2032433