gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:59:49 34 4
gpt4 key购买 nike

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

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

问题的属性好像是:

  • GCC 3.4.6 & 4.3.3 使用 -O2 优化
  • 多重继承,包括偶尔的虚拟继承。
  • 改变继承顺序,比如说,
    Foo 类:公共(public) A,公共(public) B {}
    Foo 类:公共(public) B,公共(public) A {}
    在缺少 thunk 的类上“修复”了问题。

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

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

最佳答案

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

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

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

关于c++ - "Missing non-virtual thunks"和继承顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5665771/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com