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

时间:2015-02-23 13:38:06

标签: c++ gcc g++ virtual-functions

根据this必须定义虚函数,否则链接器会抱怨&报告错误"对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;
}

1 个答案:

答案 0 :(得分:7)

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

  

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

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

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

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

但不要搞错:无论你的程序都有未定义的行为。