我需要获得一个完整对象的最前面的地址,即使我碰巧是一个子对象。
我的实验智能指针的当前版本只能比较完整对象和其中一个子对象的位置。它只是以字节为单位存储它们的地址和大小,看它们是否重叠。问题在于在多重继承的情况下比较完整对象的两个子对象。由于这些子对象不会彼此重叠,因此它们不会被识别为属于同一对象。这将需要从子对象偏移到完整对象的“头部”以获得完整对象的地址以进行比较。
请注意,此比较与访问或销毁对象无关。它只是将句柄映射到对象,无论句柄的子类型是什么。一旦不再存在对同一对象的引用,句柄本身负责保持类型并处理它。
是否有可能劫持vtable以获得完整对象的偏移量?我一直无法找到允许你这样做的标准功能。我的假设是滥用vtable是高度依赖于实现的,很可能不会在另一个编译器上重用。在对象上使用typeid可以计算出完整对象被赋予子对象的内容,因此我相信它可以实现。太糟糕了,它不会返回那个地址......
只是要清楚:我不需要在另一个对象内部的子对象的偏移量。我需要反过来做,从子对象中找到完整的对象,而不知道完整对象的类型。
答案 0 :(得分:2)
dynamic_cast<void*>(myBaseObject);
执行此操作将获得指向最原始类型的指针,即最完整的对象。一旦掌握了指针,你就可以做你喜欢的事。