我们在C ++中有一个很大的代码库,在一个小的重构(一个类添加并重写了一些相关的方法)之后,我们开始在GCC 3& 4.在我们的大型SDK中继承了类的小型示例程序中,链接器错误明确地“缺少对非虚拟thunk的引用”。
搜索网络并没有给出一些似乎已经解决的旧GCC漏洞之外的许多提示。
问题的属性似乎是:
-O2
class Foo: public A, public B {}
到class Foo: public B, public A {}
虚拟继承仅出现在一个非常常用的基类中,用于引用计数。我已经证实,这个类的每个用法都是虚拟公共的,而不仅仅是公共继承。
显然,摆弄继承顺序并不能真正解决问题。还有什么呢?
答案 0 :(得分:1)
如果更改基类的声明顺序可以解决问题,则可能意味着其中一个基类没有正确定义它声明的内容。
例如,如果您在A类中使用(非虚拟)方法Func并且在B类中具有相同的声明但是您从未为类A定义它,那么第一次在您的孩子中调用该方法时,调用A类的版本,但在链接时,找不到引用。 如果更改继承顺序,将使编译器调用B :: Func,这是定义的,然后链接器将找到它。
恕我直言,无论如何,这是一个糟糕的设计,因为行为很难预测和调试。
答案 1 :(得分:0)
如果是,请检查this线程