假设我有两个接口(interface) IFoo
, 和 IBar
;加上具体类型 FooBar
实现这些接口(interface):
class FooBar : public IFoo, public IBar
{
//FooBar stuff
};
我在某处得到一个 void*
指针,指向 FooBar
实例。
void* fooBar = getOrCreateStuff();
现在我想获得关于 IBar
的指针来 self 的 fooBar
实例。
IBar* iBar = static_cast< IBar* >(fooBar);
不幸的是,iBar
没有指向正确的内存地址。这个例子是故意的——在现实生活中,我不知道我指向的具体类型。
编辑:我正在编写一个公开了 template <class StuffT> StuffT getOrCreateStuff()
的 API方法。在这一点上,绝对没有办法知道开发人员正在使用什么类型。上面的示例向大家展示了应该使用此方法的方式。我们在 API 中注册一个具体类型并将其作为接口(interface)取回。它在处理单继承时很有用,但多继承更复杂。
有没有办法让我的 iBar 指向工作地址偏移量?
最佳答案
如果你不知道你指的是什么,那你就倒霉了!使用 static_cast(v),其中“v”的类型为“void*”,如果“v”是隐式转换为“void*”的结果,则只能转换为类型“T*”。如果你真的得到一个“void*”,你需要先恢复一个类型“B*”(例如某种基类;它不必是所有分支的公共(public)基类,只知道存在) 它至少有一个虚函数(例如,如果那里没有你想要的任何功能,它的析构函数),你可以从那里使用 dynamic_cast(b) 来恢复继承层次结构中某处的某种类型。请注意,如果实际对象中有多个“T”子对象,即使这样也不一定有效。
所有这些都是必要的原因是,在使用多重继承的对象中,指向子对象的指针正在调整:根据您所在的分支,可能存在相同的子对象,并且处理特定的子对象需要不同的指针。您可以避免使用 dynamic_cast(b),但前提是您有效地创建了自己的运行时信息系统。
关于c++ - C++多重继承时如何获取正确的指针 "alignment"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675079/