2011-12-15 94 views
3

我有一個從Y和Z派生的類(接口)。這個類的一個對象作爲void *傳遞給一個只能訪問接口Z的void *。[它不作爲Z *傳遞的原因是一箇中間組件,它只接受void *]gcc thunk hack多重繼承

與gcc thunk的vtable將X,Y指向相同的地址,但Z指向X + 8因此,我需要將對象轉換爲(Z *)(obj + 8)以獲得Z.這個安全,有沒有其他的選擇?我不能使用RTTI。

+1

static_cast (reinterpret_cast (obj))其中obj是一個void * – 2011-12-15 09:08:54

回答

2

不,鑄造(Z*)(obj + 8)不安全。

鑄造鑄造void*前的對象Z*後,再鑄造void*Z*。這將是安全的。

3

在這種情況下,只需將其明確地轉換爲您要使用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!!! 

事件雖然ZX一個子類,以及兩者之間的直接static_cast會工作。