2011-02-03 53 views
2

實施IUnknown::QueryInterface()的典型方式是:使用if-else-if鏈每個支持的接口ID並執行以下操作:在QueryInterface實現中應該使用dynamic_cast嗎?

if(iid == __uuidof(IInterfaceN)) { 
    *ppv = static_cast<IInterfaceN>(this); 
    //call Addref(), return S_OK 
} 

現在static_castis necessary這裏在多重繼承的情況適當的指針調整。

有一段時間我看到的實現,而不是使用dynamic_cast。國際海事組織這是浪費時間 - 結果將是相同的,它只會花費更長的時間,並使實施過度工程化。

是否有使用dynamic_cast在任何情況下,確實有必要將它複製到的IUnknown::QueryInterface()實施void**參數之前鑄造this指針?

回答

1

在那些「支持的接口標識符」未知的QueryInterface的實現中,這將是必要的。例如。如果您決定在基類中實現QueryInterface,並且不覆蓋每個派生類。

發生這種情況的情況是,您有很多類似的類型,其中「類似」意味着「實現許多相同的接口」。即你有對象類型Derived1 ... DerivedN這些都實現了Interface1的一些子集... InterfaceM

這可能是一個遊戲引擎,其中游戲實體都實現的一個子集的情況下IMoveableIScriptableIFactoryIShootsIPlayerControlledIStealthyISensor,等等。當然,按照COM規則,當且僅當工廠也執行IMovable時,您必須能夠撥打IFactory::QueryInterface並獲得IMovable*

你打算如何實現所有這些QueryInterface方法?在IUnknownIFactory之間插入GameObject基類最容易,並且使用dynamic_cast檢查來執行GameObject::QueryInterface。這樣,您只需要一個實現,而不是每個具體類型的接口。

+0

Emm ...你能否提供一些最簡單的這種層次結構的例子? – sharptooth 2011-02-03 11:41:45

1

QueryInterface()實際上是一個「動態強制轉換」操作符的實現。將實現放在另一個需要另一個相同元數據變體(繼承樹)的實現之上是沒有意義的。

一個好的編譯器應該能夠將其重新映射到static_cast

相關問題