我感兴趣的是比较继承IUnknown的两个IDirect3DDevice9 COM指针是否相等。基于similar topic,我知道您可以对两个指针执行QI IUnknown,然后比较结果是否相等。然而,我很好奇,我们是否可以通过一个直接接受两个IUnknown指针的IsEqual方法来完成同样的事情,让继承来确定相关的IUnknown指针,并将其用于相等检查。根据我的实验,这似乎是有效的,并且不需要QI和release操作(或者这可能是隐式完成的)。如果有任何警告可以保证这个建议无效,请让我知道。
BOOL IsEqual(IUnknown *pA, IUnknown *pB)
{
return (pA == pB);
}
BOOL IsEqual (IDirect3DDevice9 *pDevice1, IDirect3DDevice9 *pDevice2)
{
IUnknown *u1, *u2;
pDevice1->QueryInterface(IID_IUnknown, &u1);
pDevice2->QueryInterface(IID_IUnknown, &u2);
BOOL areSame = u1 == u2;
u1->Release();
u2->Release();
return areSame;
}发布于 2016-02-26 18:12:43
下面是一些具有多重继承的示例代码。在这里,IUnknown在层次结构中出现两次,但任何其他接口也可能出现两次。
我正在使用不是特定于Visual C++的功能,以便更容易在在线编译器服务上试用此代码。
#include <stdio.h>
class IUnknown {};
class IInterface1 : public IUnknown {};
class IInterface2 : public IUnknown {};
class Class : public IInterface1, public IInterface2 {};
int main() {
Class object;
// Please note that only implicit conversions are used -
// exactly as if you were passing Derived* pointers into
// a function that accepts Base* pointers
IInterface1* interface1 = &object;
IUnknown* unknown1 = interface1;
IInterface2* interface2 = &object;
IUnknown* unknown2 = interface2;
printf( "%p %p %s", unknown1, unknown2,
(unknown1 == unknown2) ? "true" : "false");
}这段代码输出如下:
0xbfc8e9de 0xbfc8e9df false
所以,你不能依靠向上转换来检查身份--根据你从哪里开始的漫游,你可以到达同一个对象的不同目的地。这正是这段代码不能编译的原因:
IUnknown* unknown = &object;//WON'T COMPILE因为转换是不明确的。只有在告诉了要使用哪条继承路径之后,代码才会编译。一旦你选择了路径,你可能会得到相同基类的不同的子对象,这些子对象当然会位于不同的地址。
https://stackoverflow.com/questions/35549341
复制相似问题