首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过QI或继承实现的IUnknown相等之间的区别

通过QI或继承实现的IUnknown相等之间的区别
EN

Stack Overflow用户
提问于 2016-02-22 16:52:25
回答 1查看 117关注 0票数 2

我感兴趣的是比较继承IUnknown的两个IDirect3DDevice9 COM指针是否相等。基于similar topic,我知道您可以对两个指针执行QI IUnknown,然后比较结果是否相等。然而,我很好奇,我们是否可以通过一个直接接受两个IUnknown指针的IsEqual方法来完成同样的事情,让继承来确定相关的IUnknown指针,并将其用于相等检查。根据我的实验,这似乎是有效的,并且不需要QIrelease操作(或者这可能是隐式完成的)。如果有任何警告可以保证这个建议无效,请让我知道。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-26 18:12:43

下面是一些具有多重继承的示例代码。在这里,IUnknown在层次结构中出现两次,但任何其他接口也可能出现两次。

我正在使用不是特定于Visual C++的功能,以便更容易在在线编译器服务上试用此代码。

代码语言:javascript
复制
#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

所以,你不能依靠向上转换来检查身份--根据你从哪里开始的漫游,你可以到达同一个对象的不同目的地。这正是这段代码不能编译的原因:

代码语言:javascript
复制
 IUnknown* unknown = &object;//WON'T COMPILE

因为转换是不明确的。只有在告诉了要使用哪条继承路径之后,代码才会编译。一旦你选择了路径,你可能会得到相同基类的不同的子对象,这些子对象当然会位于不同的地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35549341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档