我有一个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)