我有一個從Y和Z派生的類(接口)。這個類的一個對象作爲void *傳遞給一個只能訪問接口Z的void *。[它不作爲Z *傳遞的原因是一箇中間組件,它只接受void *]gcc thunk hack多重繼承
與gcc thunk的vtable將X,Y指向相同的地址,但Z指向X + 8因此,我需要將對象轉換爲(Z *)(obj + 8)以獲得Z.這個安全,有沒有其他的選擇?我不能使用RTTI。
我有一個從Y和Z派生的類(接口)。這個類的一個對象作爲void *傳遞給一個只能訪問接口Z的void *。[它不作爲Z *傳遞的原因是一箇中間組件,它只接受void *]gcc thunk hack多重繼承
與gcc thunk的vtable將X,Y指向相同的地址,但Z指向X + 8因此,我需要將對象轉換爲(Z *)(obj + 8)以獲得Z.這個安全,有沒有其他的選擇?我不能使用RTTI。
不,鑄造(Z*)(obj + 8)
不安全。
鑄造鑄造void*
前的對象Z*
後,再鑄造void*
回Z*
。這將是安全的。
在這種情況下,只需將其明確地轉換爲您要使用static_cast
發送的類型即可。它會處理細節,只要它知道它正在轉換的類型。
即:
X *theX = ...;
void *ptr = static_cast<Z*>(theX)
然後在接收代碼:
void *ptr = ...;
Z *theZ = static_cast<Z*>(ptr);
如果你知道,它實際上是一個X
:
X *theX = static_cast<X*>(theZ);
底線是:每當你投入一個指針到void*
後面,它應該轉換爲它以前的相同類型。
因此,這是不明確的:
X *theX = ...;
void *ptr = static_cast<void*>(theX);
Z *theZ = static_cast<Z*>(ptr); //Undefined behavior!!!
事件雖然Z
是X
一個子類,以及兩者之間的直接static_cast
會工作。
static_cast(reinterpret_cast (obj))其中obj是一個void * –
2011-12-15 09:08:54