我有兴趣比较两个IDirect3DDevice9 COM指针,这些指针继承IUnknown以获得相等性。基于similar topic,我知道您可以为两个指针QI IUnknown,并比较结果是否相等。但是,我很好奇我们是否可以通过直接使用两个IsEqual指针的IUnknown方法完成相同的事情,让继承确定相关的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");
}

此代码输出:



因此,不能,您不能依靠上流检查身份-根据开始步行的位置,您可以到达同一对象的不同目的地。这就是为什么此代码无法编译的原因:
 IUnknown* unknown = &object;//WON'T COMPILE

因为转换是模棱两可的。只有在您知道要使用哪个继承路径的情况下,该代码才会编译。一旦选择了路径,您最终可能会得到同一基类的不同子对象,这些子对象当然会位于不同的地址。

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

10-10 12:46