8

我们在 C++ 中有一个庞大的代码库,在进行了一次小的重构(添加了一个类并重写了一些相关方法)之后,我们开始在 GCC 3 和 4 上遇到链接器错误。链接器错误特别是“缺少对非虚拟 thunk 的引用”在我们的大型 SDK 中子类化类的小示例程序。

除了一些似乎已解决的旧 GCC 错误之外,搜索网络并没有给出很多提示。

问题的属性似乎是:

  • GCC 3.4.6 & 4.3.3 优化-O2
  • 多重继承,包括偶尔的虚拟继承。

  • class Foo: public A, public B {} 例如,将继承顺序从
    class Foo: public B, public A {}
    缺少 thunk 的类更改为“修复”问题。

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

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

4

2 回答 2

1

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

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

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

于 2012-10-29T11:42:48.790 回答
0

可能是钻石问题

如果是这样检查这个线程

于 2012-10-16T13:27:37.853 回答