【发布时间】:2013-05-10 13:49:01
【问题描述】:
我有一个抽象基类Foo 和一个名为bar 的抽象方法。
我从Foo 的构造函数中调用bar。我希望子类覆盖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)
【问题讨论】:
标签: c++ constructor abstract-class linker-errors abstract