我有一个派生自 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!!!
尽管 Z
是 X
的子类,但两者之间的直接 static_cast
会起作用。
关于c++ - gcc thunk hack 用于多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8517422/