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



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

#include <iostream>
using namespace std;
class Test
{
    public:
    Test()
    {
        cout<<"test() is calledn";
    }
    virtual void test();
};
int main() {
    Test t;
    // your code goes here
    return 0;
}

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

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

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

实际上,只有在以下情况下,你才可能得到这种诊断:

  • 您调用了一个未定义的虚拟函数
  • 实例化一个对象,该对象的virtual析构函数未定义

但别搞错了:不管怎样,你的程序都有未定义的行为。

最新更新