gpt4 book ai didi

c++ - 为什么只有声明的虚函数会导致编译器错误?

转载 作者:IT老高 更新时间:2023-10-28 22:35:25 25 4
gpt4 key购买 nike

我有这门课,

class Base {
public:
void foo();
};

int main()
{
Base b;
}

main 将编译没有任何错误,尽管 foo() 没有定义。但是 b.foo(); 会导致编译错误。

而且,即使是constructoroperator=,我也可以不定义就直接声明,只要不触发就可以编译。

问题

再次,我在 Base 中添加了一个虚函数,

class Base {
public:
void foo();
virtual void bar(); // no defition is gonna be provided.
};

现在,main 无法编译,而是出现错误:

undefined reference to vtable for Base

这让我有点困惑,因为以前,只要不调用 foo()main 就可以编译,但现在我添加了 bar( ) 而且它根本没有被调用。

为什么在这种情况下它不编译?

最佳答案

这完全取决于编译器。这两种情况都不需要诊断。

10.3 虚函数[class.virtual]

9 A virtual function declared in a class shall be defined, or declared pure (10.4) in that class, or both; but no diagnostic is required (3.2). [emphasis mine]

要了解为什么会发生这种情况,让我们看看它是如何工作的。

每个翻译单元生成一个目标文件,每个目标文件都有导出(它导出的符号)和导入(它想要的符号)。

第一个例子很简单——导入只需要 foo 时使用。链接器没有理由寻找符号,所以它不会。

第二个,使用 virtual 方法,有点复杂。大多数编译器(如果不是全部)都需要有效的虚函数表。这意味着在链接时,所有声明非纯虚方法的类都必须导出这些方法。这比非virtual 的情况更严格,因为实现实际上并不知道函数是否被调用(它可以被多态调用)。

关于c++ - 为什么只有声明的虚函数会导致编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316494/

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