gpt4 book ai didi

c++ - 通过 QI 或继承的 IUnknown 平等之间的区别

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:40 24 4
gpt4 key购买 nike

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

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;
}

最佳答案

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

我使用的功能不是 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

因为转换不明确。只有在您指定要使用的继承路径后,该代码才能编译。一旦您选择了路径,您最终可能会得到同一基类的不同子对象,这些子对象当然会位于不同的地址。

关于c++ - 通过 QI 或继承的 IUnknown 平等之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35549341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com