undefined reference to vtable 错误是由现代 g++ 编译器解决的吗?
is the undefined reference to vtable error solved by modern g++ compilers?
根据 this virtual functions must be defined otherwise linker complains & reports error "undefined reference to vtable", but why doesn't 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;
}
您没有正确阅读文档。相关段落的第一句说:
The ISO C++ Standard specifies that all virtual methods of a class that are not pure-virtual must be defined, but does not require any diagnostic for violations of this rule [class.virtual]/8.
因此,预计您可能不会收到错误,尤其是因为您实际上并未调用 test()
(尽管构造函数的输出中存在谎言)。
实际上,只有在以下情况下,您才有可能得到此诊断信息:
- 你调用了一个你没有定义的虚函数
- 你实例化了一个你没有定义
virtual
析构函数的对象
但请不要误会:无论如何,您的程序都有未定义的行为。
根据 this virtual functions must be defined otherwise linker complains & reports error "undefined reference to vtable", but why doesn't 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;
}
您没有正确阅读文档。相关段落的第一句说:
The ISO C++ Standard specifies that all virtual methods of a class that are not pure-virtual must be defined, but does not require any diagnostic for violations of this rule [class.virtual]/8.
因此,预计您可能不会收到错误,尤其是因为您实际上并未调用 test()
(尽管构造函数的输出中存在谎言)。
实际上,只有在以下情况下,您才有可能得到此诊断信息:
- 你调用了一个你没有定义的虚函数
- 你实例化了一个你没有定义
virtual
析构函数的对象
但请不要误会:无论如何,您的程序都有未定义的行为。