【问题标题】:is the undefined reference to vtable error solved by modern g++ compilers?现代 g++ 编译器是否解决了对 vtable 错误的未定义引用?
【发布时间】:2015-04-24 20:27:04
【问题描述】:

根据this必须定义虚函数,否则链接器会报错"undefined reference to 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;
}

【问题讨论】:

  • 你没有在任何地方调用未定义的成员。
  • @juanchopanza 我在一些编译器上看到,即使未调用成员,未定义的虚函数也会导致错误。我不记得标准是否允许这样做。
  • 可能是因为(在内联和其他优化之后)程序从不尝试使用 vtable,所以没有任何需要定义的引用。如果你做了任何需要它的事情,你可能仍然会得到一个错误。
  • @MikeSeymour:如果是,调用将失败,因为没有可用的定义。

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


【解决方案1】:

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

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

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

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

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

但请不要误会:无论如何,您的程序都有未定义的行为。

【讨论】:

  • 尽管构造函数的输出中存在谎言 haha​​hahaha
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多