“缺少非虚拟thunk”和继承顺序

时间:2011-04-14 15:37:00

标签: c++ gcc thunk

我们在C ++中有一个很大的代码库,在一个小的重构(一个类添加并重写了一些相关的方法)之后,我们开始在GCC 3& 4.在我们的大型SDK中继承了类的小型示例程序中,链接器错误明确地“缺少对非虚拟thunk的引用”。

搜索网络并没有给出一些似乎已经解决的旧GCC漏洞之外的许多提示。

问题的属性似乎是:

  • GCC 3.4.6& 4.3.3使用-O2
  • 进行优化
  • 多重继承,包括偶尔的虚拟继承。
  • 更改继承顺序,例如,
    class Foo: public A, public B {}
    class Foo: public B, public A {}
    在缺少thunk的类“修复”问题。

虚拟继承仅出现在一个非常常用的基类中,用于引用计数。我已经证实,这个类的每个用法都是虚拟公共的,而不仅仅是公共继承。

显然,摆弄继承顺序并不能真正解决问题。还有什么呢?

2 个答案:

答案 0 :(得分:1)

如果更改基类的声明顺序可以解决问题,则可能意味着其中一个基类没有正确定义它声明的内容。

例如,如果您在A类中使用(非虚拟)方法Func并且在B类中具有相同的声明但是您从未为类A定义它,那么第一次在您的孩子中调用该方法时,调用A类的版本,但在链接时,找不到引用。 如果更改继承顺序,将使编译器调用B :: Func,这是定义的,然后链接器将找到它。

恕我直言,无论如何,这是一个糟糕的设计,因为行为很难预测和调试。

答案 1 :(得分:0)

可能是diamond problem

如果是,请检查this线程