假設我有一個類實現兩個或多個COM接口(完全一樣here):使用隱式轉換爲上傳而不是QueryInterface()合法與多繼承?
class CMyClass : public IInterface1, public IInterface2 {
};
QueryInterface()
必須返回相同的指針相同的接口的每個請求(它需要一個顯式上溯造型適當指針調整) :
if(iid == __uuidof(IUnknown)) {
*ppv = static_cast<IInterface1*>(this);
//call Addref(), return S_OK
} else if(iid == __uuidof(IInterface1)) {
*ppv = static_cast<IInterface1*>(this);
//call Addref(), return S_OK
} else if(iid == __uuidof(IInterface2)) {
*ppv = static_cast<IInterface2*>(this);
//call Addref(), return S_OK
} else {
*ppv = 0;
return E_NOINTERFACE;
}
現在的目標是2 IUnknown
秒 - 一個是IInterface1
的基礎,另一個是IInterface2
基礎。和。
讓我們假設我打電話QueryInterface()
爲IInterface2
- 當我打電話QueryInterface()
爲IUnknown
返回將從指針不同的指針返回。到現在爲止還挺好。然後,我可以將檢索到的IInterface2*
轉換爲接受IUnknown*
的任何函數,並且感謝C++隱式轉換,指針將被接受,但將檢索QueryInterface()
不同於指針。實際上,如果該函數在調用後立即調用QueryInterface()
,IUnknown
它將檢索不同的指針。
這是合法的COM?當我有一個指向多重繼承對象的指針並且允許隱式預測時,我該如何處理情況?
實際上,我從來沒有見過任何代碼使用COM標識規則。也就是說,另一個IUnknown *不合法 - 您必須選擇一個從QueryInterface返回。 就你自己的,內部的C++使用COM對象實現對象而言 - 如果你投你不做COM,那麼你所做的任何事情都是合法的C++,而不是Legitimage COM。 – 2010-07-06 11:26:53
@Chris Becke:我猜身份是實現一些類似緩存的功能所必需的。 – sharptooth 2010-07-07 07:27:38