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

标签 c++ gcc thunk

我们在 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/

相关文章:

sml - 在 SML 中是否有多种编写 thunk 的方法?

Scala 惰性 val 缓存

c++ - 找出 AxB 的网格中有多少圈

c++ - 对象即时 VB Net 的 vector

c++ - linux 上的 Stanford Stanford C++ 库

c++ - 如何在 Linux 上延迟加载共享库

c++ - 关于类成员自初始化的警告

c++ - 返回对象数组的函数

c++ - Cygwin: g++ 5.2: ‘to_string’ 不是 ‘std’ 的成员

Clojure thunks : stack overflow with [0] but not '(0)?