2011-12-27 47 views
2

即使碰巧是子對象,我也需要獲得完整對象的最前面的地址。從子對象完成對象的偏移量

我的實驗性智能指針的當前版本只能比較完整對象和它的一個子對象的位置。它只是以字節爲單位存儲它們的地址和大小,並查看它們是否重疊。問題在於在多重繼承的情況下比較完整對象的兩個子對象。由於這些子對象不會相互重疊,因此不會被識別爲屬於同一個對象。這需要偏移子對象中完整對象的「頭部」以獲取完整對象的地址以供比較。

請注意,此比較與訪問或破壞對象無關。只是將句柄映射到對象,而不管句柄的子類型是什麼。一旦不存在對同一對象的更多引用,句柄本身負責保存類型和處理它。

是否有可能劫持虛擬表以獲得完整對象的偏移量?我一直無法找到一個可以讓你做到這一點的標準功能。我的假設是濫用vtable是高度依賴於實現的,並且很可能不會在其他編譯器上重用。在一個對象上使用typeid可以設法找出完整的對象被賦予了一個子對象,所以我相信這是可以實現的。太糟糕了,它不會返回該地址...

只是要清楚:我不需要在另一個對象內的子對象的偏移量。我需要以相反的方式執行此操作,並在不知道完整對象類型的情況下從子對象中找到完整對象。

回答

2
dynamic_cast<void*>(myBaseObject); 

這樣做會爲您提供一個指向最鏤空類型的指針,即最完整的對象。一旦你有了指針,你就可以做你喜歡的事情。

+0

我不敢相信它就這麼簡單!這對我來說太簡單了,但是非常有意義。 非常感謝! – Zoomulator

+1

@Zoomulator - 這是非常晦澀難懂的,直到你知道它存在爲止。 [這個問題](http://stackoverflow.com/questions/8123776/are-there-practical-uses-for-dynamic-casting-to-void-指針)是相關的。 – Flexo