c++ - C++多重继承时如何获取正确的指针 "alignment"?

标签 c++ pointers multiple-inheritance void-pointers vtable

假设我有两个接口(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/

相关文章:

c++ - 使用数组作为数组元素时出错

c++ - 如何将二维 map 作为函数指针传递

c - 线程中的全局变量指针

perl - 为什么$class->SUPER::new在使用多重继承时不调用所有父类的构造函数?

c++ - 在具有多重继承的类构造函数中传递什么?

c++ - 来自 openCV 的代码有什么作用?

C++代数计算

c++ - 从指针 vector 的 vector 中释放内存

c# - 在 Entity Framework 中使用TPT设计的多级继承

c++ - 运算符(operator)在创建此2D节点阵列时是否遇到问题?