c++ - gcc thunk hack 用于多重继承

标签 c++ gcc multiple-inheritance

我有一个派生自 Y 和 Z(接口(interface))的类 X。此类的一个对象作为 void* 传递给库,它只能访问接口(interface) Z。[它不作为 Z* 传递的原因是存在一个只接受 void* 的中间组件]

带有 gcc thunk 的 vtable 的布局将是 X,Y 指向相同的地址,但是 Z 指向 X + 8

所以,我需要将对象类型转换为 (Z *) (obj + 8) 才能到达 Z。这安全吗,还有其他选择吗?我不能使用 RTTI。

最佳答案

在这种情况下,只需使用 static_cast 显式转换为您要发送的类型。它会处理细节,只要它知道正在转换的来源/目标类型。

即:

X *theX = ...;
void *ptr = static_cast<Z*>(theX)

然后在接收代码中:

void *ptr = ...;
Z *theZ = static_cast<Z*>(ptr);

如果您知道它实际上是一个X:

X *theX = static_cast<X*>(theZ);

底线是:无论何时将指针转换为 void* 并返回,它都应该转换为与之前完全相同的类型。

因此,这是未定义的:

X *theX = ...;
void *ptr = static_cast<void*>(theX);
Z *theZ = static_cast<Z*>(ptr); //Undefined behavior!!!

尽管 ZX 的子类,但两者之间的直接 static_cast 会起作用。

关于c++ - gcc thunk hack 用于多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8517422/

相关文章:

c++ - 如何将 NDEF 中的 NFC 标签转换为非 NDEF

c++ - 如何在 Visual C++ 中延迟静态数据成员的实例化?

c++ - 更改垂直标题标题

c - malloc 是确定性的吗?

c++ - 了解继承多个空类时 gcc/clang 与 msvc2015 之间的不同填充规则

c++ - 如何在 Qt 中监听 QDynamicPropertyChangeEvent 来检测属性变化?

linux - 使用 gcc.7.2 编译器时,Linux 中的 stdio.h 文件在哪里?

c - 内联 (x86) 汇编如何影响程序流程?

java - 将具体类对象持久化到数据库时,将抽象类中的字段设置为强制字段

C++派生类链构造函数错误