假设我有一个类实现两个或多个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