【问题标题】:Offset to complete object from subobject从子对象到完整对象的偏移
【发布时间】:2011-12-27 17:50:27
【问题描述】:

即使我碰巧是一个子对象,我也需要获取完整对象的最前面的地址。

我的实验智能指针的当前版本只能比较完整对象和其中一个子对象的位置。它只是以字节为单位存储它们的地址和大小,并查看它们是否重叠。问题在于在多重继承的情况下比较一个完整对象的两个子对象。由于这些子对象不会相互重叠,因此它们不会被识别为属于同一对象。这将需要从子对象到完整对象的“头”的偏移量,以获得完整对象的地址以进行比较。

请注意,这种比较与访问或破坏对象无关。它只是将句柄映射到一个对象,不管句柄的子类型是什么。句柄本身负责保存类型并在不再存在对同一对象的引用时处理它。

是否可以劫持 vtable 以获得完整对象的偏移量?我一直找不到允许您执行此操作的标准功能。我的假设是滥用 vtable 高度依赖于实现,并且很可能无法在另一个编译器上重用。在对象上使用 typeid 可以计算出给定子对象的完整对象,所以我相信它是可以实现的。太糟糕了,它不会返回那个地址...

明确一点:我不需要子对象在另一个对象中的偏移量。我需要反其道而行之,在不知道完整对象类型的情况下从子对象中找到完整对象。

【问题讨论】:

    标签: c++ vtable


    【解决方案1】:
    dynamic_cast<void*>(myBaseObject);
    

    这样做会给你一个指向最衍生类型的指针,即最完整的对象。一旦你得到那个指针,你就可以用它做你喜欢的事情。

    【讨论】:

    • 我不敢相信就这么简单!这对我来说太简单了,但完全有道理。非常感谢!
    • @Zoomulator - 在你知道它存在之前,它会这样做是非常模糊和不明显的。 This question 是相关的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2015-04-11
    • 2020-01-16
    • 2017-10-19
    • 2019-07-29
    相关资源
    最近更新 更多