gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:27:20 25 4
gpt4 key购买 nike

我有一个抽象基类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com