如何解决“缺少非虚拟对象”和继承顺序
|| 我们在C ++中有大量的代码库,并且经过较小的重构(添加了一个类,并重写了一些相关方法),我们开始在GCC 3和4上遇到链接器错误。链接器错误特别是“缺少对非虚拟thunk的引用” ”在小型示例程序中,这些示例程序将大型SDK中的类子类化。 除了似乎已解决的一些旧GCC错误之外,搜索网络并没有提供很多提示。 该问题的属性似乎是: GCC 3.4.6和4.3.3使用ѭ0进行优化 多重继承,包括偶发的虚拟继承。 例如,更改继承顺序class Foo: public A,public B {}
至
class Foo: public B,public A {}
在类中缺少thunk的“修复”问题。
虚拟继承仅出现在单个的,非常常用的基类中,用于引用计数。我已经证实,此类的所有用法实际上都是虚拟公共的,而不仅仅是偶然的公共继承。
显然,摆弄继承顺序并不能真正解决问题。还有什么呢?
解决方法
如果更改基类的声明顺序可以解决此问题,则可能意味着基类之一未正确定义其声明的内容。
例如,如果您在类A中有一个声明(使用非虚拟方法)Func,而在类B中有相同的声明,但从未为类A定义它,那么第一次在您的孩子中调用该方法时,类A \的版本被调用,但是在链接时,找不到引用。
如果更改继承顺序,则将使编译器改为调用B :: Func,它已定义,然后链接程序将找到它。
恕我直言,这毕竟是一个糟糕的设计,因为那里的行为将很难预测和调试。
,可能是钻石问题
如果是这样,请检查此线程
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。