根据此,必须定义虚拟函数,否则链接器将抱怨&报告错误"对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
析构函数未定义
但别搞错了:不管怎样,你的程序都有未定义的行为。