"Missing non-virtual thunks"和继承顺序

"Missing non-virtual thunks" and inheritance order

本文关键字:继承 顺序 thunks Missing non-virtual      更新时间:2023-10-16

我们有一个很大的c++代码库,在一个小的重构(增加一个类和重写一些相关的方法)之后,我们开始在GCC 3中出现链接器错误;4. 链接器错误是指在我们的大型SDK中子类化类的小示例程序中"缺少对非虚拟库的引用"。

搜索网页并没有给出很多提示,除了一些旧的GCC bug似乎已经解决。

这个问题的属性似乎是:

  • GCC 3.4.6 &4.3.3 -O2
  • 优化
  • 多重继承,包括偶尔的虚拟继承。
  • 改变继承顺序,比如
    class Foo: public A, public B {}
    class Foo: public B, public A {}
    关于丢失的职业,坦克"修复"了这个问题。

虚拟继承只出现在用于引用计数的一个非常常用的基类中。我已经验证了这个类的每次使用都是虚拟公共的,而不仅仅是偶然的公共继承。

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

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

例如,如果你在类a中有一个(非虚的)方法Func的声明,在类B中也有相同的方法,但你从未为类a定义过它,那么在子类中第一次调用该方法时,会调用类a的版本,但在链接时,没有找到引用。如果你改变了继承顺序,将会使编译器调用B::Func,而B::Func是定义好的,然后链接器会找到它。

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

可能是菱形问题

检查这个线程