0

在followint代碼中,指針轉換&多重繼承如何一起玩?以下foward聲明的多繼承指針轉換代碼如何工作?

class Foo { 
    public: 
    virtual void someFunc(); 
}; 

class Bar; 


void someWork(Bar *bar) { 
    ((Foo*) bar)->someFunc(); 
} 

class Bar: public Zed, public Foo { 
... 
virtual void someFunc() { ... do something else ... } 
} 

Bar bar; 

int main() { 
    someWork(&bar); 
} 

我的理解有點不穩定。

一方面,有些工作對酒吧一無所知,所以這不應該工作;但另一方面,我已經向前宣佈了Bar。

謝謝!

+1

對另一個問題的這個答案有一個很好的列表,你可以做什麼,不能做一個不完整的類型:http://stackoverflow.com/questions/553682/when-to-use-forward-declaration/553869#553869 – 2010-01-31 06:13:23

回答

5

這不起作用,它沒有做到你認爲的那樣。您使用C風格演員:

(Foo*) bar 

在這種情況下不正確。你試圖做的是將Bar*上傳到Foo*(即,從指向dervied類的指針到指向基類的指針執行static_cast)。

由於Bar的定義目前尚不可用,編譯器不知道FooBar的基類。因此,static_cast失敗,編譯器退回並使用reinterpret_cast,這不完全相同。

+0

我無法讓你滿意。 – anon 2010-01-31 06:25:33

0

嗯。我的猜測是,因爲演員在鏈接過程中被「評估」,這是在課程編輯完成之後。但這只是一個猜測。