是现代g ++编译器解决的vtable错误的未定义引用?

Des*_*tor 3 c++ gcc virtual-functions g++

根据这个虚函数必须定义,否则链接器抱怨并报告错误"未定义引用vtable",但为什么ideone编译器不会为以下代码提供任何错误?

#include <iostream>
using namespace std;
class Test
{
    public:
    Test()
    {
        cout<<"test() is called\n";
    }
    virtual void test();
};
int main() {
    Test t;
    // your code goes here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 7

您没有正确阅读文档.相关段落的第一句话说:

ISO C++标准规定必须定义非纯虚拟类的所有虚方法,但不要求违反此规则的任何诊断[class.virtual]/8.

因此,预计您可能不会收到错误,特别是因为您实际上并未调用test()(尽管构造函数的输出中存在谎言).

实际上,只有在下列情况下,您才有可能获得此诊断:

  • 你调用一个你没有定义的虚函数
  • 您实例化一个virtual您没有定义析构函数的对象

但不要搞错:你的程序有不确定的行为.

  • *尽管构造函数的输出中存在谎言*haha​​hahaha (4认同)