c++ - 未在抽象基类中声明抽象方法导致链接器错误?

标签 c++ constructor abstract-class linker-errors abstract

我有一个抽象基类 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 - 基于 Qt 5.0.2(32 位)

最佳答案

在构造器内部,*this的动态类型是Foo,没有定义函数Foo::bar。不要在构造函数中调用虚函数。 (除非您知道自己在做什么,否则您会知道如何提供定义。)

关于c++ - 未在抽象基类中声明抽象方法导致链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16574379/

相关文章:

C# 抽象类运算符重载

c++ - Segmentation Fault,归并排序算法

c++ - 如何更新 clang 版本以编译 C++11 项目? (在 Mac 上)

c# - 派生类中的无意基类构造函数 "hiding"

java - 我的子类构造函数中的构造函数错误

java - 如何设计一个继承自Rectangle类的Square类

unit-testing - 在 TypeScript 中为抽象类创建扩展匿名类

c++ - 避免代码重复定义比较运算符 `<, <=, >, >=, ==, !=` 但考虑到 NaN 的最佳方法?

c++ - Getline 不工作

c++ - 奇怪的模板构造函数语法