通过QI或继承

时间:2016-02-22 08:52:25

标签: c++ pointers com

我有兴趣比较两个继承IDirect3DDevice9的{​​{1}} COM指针的相等性。基于similar topic,我了解您可以IUnknown QI获取两个指针,并将结果进行比较以获得相等性。但是,我很好奇我们是否可以通过直接接受两个IUnknown指针的IsEqual方法完成同样的事情,让继承确定相关的IUnknown指针,并将其用于相等性检查代替。根据我的实验,这似乎有效,并且不需要IUnknownQI操作(或者可能隐式完成)。如果有任何警告保证此建议无效,请告诉我。

release

1 个答案:

答案 0 :(得分:2)

这是一些具有多重继承的示例代码。此处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

所以不,你不能依靠upcasts来检查身份 - 取决于你开始步行的地方,你可以到达同一个对象的不同目的地。这正是此代码无法编译的原因:

 IUnknown* unknown = &object;//WON'T COMPILE

因为转换含糊不清。只有在您告知要使用哪个继承路径时,该代码才会编译。一旦你选择了这条路径,你最终可能会得到同一基类的不同子对象,这些对象当然会位于不同的地址。