"Missing non-virtual thunks"和继承顺序
"Missing non-virtual thunks" and inheritance order
我们有一个很大的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是定义好的,然后链接器会找到它。
恕我直言,这是一个糟糕的设计,因为这种行为很难预测和调试。
可能是菱形问题
检查这个线程相关文章:
- CPP 继承虚拟方法解析顺序
- 继承和例外中的C'tor/D'tors的顺序
- 关于构造商的呼叫和继承顺序的混乱
- 在继承中更改构造函数的顺序
- 在虚拟继承中构造函数调用的顺序是什么
- 为什么异常捕获是基于顺序的,而不是基于最接近继承的
- c++:多态性+多重继承顺序.继承顺序是否重要
- C++继承和初始化顺序
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 继承顺序C++以何种方式影响构造函数
- 使用继承时构造函数/析构函数调用的顺序
- c++多继承顺序和虚函数
- 改变继承顺序会产生不同的结果
- 多重继承时的执行顺序
- c++中的继承:构造顺序
- 继承层次结构:构造函数和析构函数执行顺序
- 类和接口之间的继承顺序重要吗?
- 函数解析中使用的多重继承顺序
- 在继承中调用构造函数的顺序
- "Missing non-virtual thunks"和继承顺序