gpt4 book ai didi

c++ - 为什么链接器在虚拟情况下给我一个错误,但在非虚拟情况下却没有?

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

当我遇到这样的事情时:

class A
{
virtual void rat();
};

class B : public A
{
virtual void rat() { ; } //implemented!
};

int main(int argc, char **argv)
{
A *a = new B;
delete a;
}

我收到链接器错误:

除非我让 base rat 成为纯虚拟的。

但是,当我有这个时:

class A
{
public:
void rat();
};

int main(int argc, char **argv)
{
A a;
}

这可以很好地编译并且不会给我 undefined reference 链接错误,除非我明确尝试在我的 main (a.rat();) 中调用 rat 函数。未实现的基类虚函数在派生类中实现的第一个失败代码片段的规则是什么?

最佳答案

当两个类都定义虚函数时,C++编译器需要构建vtables对于 AB 这两个类。要构建 A 的 vtable,编译器需要 A::rat() - 这是引用的来源。

A 没有虚函数时,从任何地方都没有对 A::rat 的引用,因此不会出现编译错误。

我相信您知道,您可以通过将 A::rat 设为纯虚拟来修复此错误,从而为 vtable 提供所需的值(在本例中,值为零).

关于c++ - 为什么链接器在虚拟情况下给我一个错误,但在非虚拟情况下却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455131/

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