gpt4 book ai didi

c++ - 使用隐式转换而不是 QueryInterface() 进行向上转换是否合法且具有多重继承?

转载 作者:可可西里 更新时间:2023-11-01 13:29:59 27 4
gpt4 key购买 nike

假设我有一个实现两个或多个 COM 接口(interface)的类(与 here 完全一样):

class CMyClass : public IInterface1, public IInterface2 { 
};

QueryInterface()必须为同一接口(interface)的每个请求返回相同的指针(需要显式向上转换才能正确调整指针):

if( iid == __uuidof( IUnknown ) ) { 
*ppv = static_cast<IInterface1*>( this );
//call Addref(), return S_OK
} else if( iid == __uuidof( IInterface1 ) ) {
*ppv = static_cast<IInterface1*>( this );
//call Addref(), return S_OK
} else if( iid == __uuidof( IInterface2 ) ) {
*ppv = static_cast<IInterface2*>( this );
//call Addref(), return S_OK
} else {
*ppv = 0;
return E_NOINTERFACE;
}

现在有两个IUnknown对象中的 s - 一个是 IInterface1 的基数另一个是 IInterface2 的基础.和 they are in different subobjects .

假设我调用 QueryInterface()对于 IInterface2 - 返回的指针将不同于我调用 QueryInterface() 时返回的指针对于 IUnknown .到目前为止,一切都很好。然后我可以传递检索到的 IInterface2*进入任何接受 IUnknown* 的函数由于 C++ 隐式转换,指针将被接受,但它与 QueryInterface() 的指针不同。对于 IUnknown*会检索。事实上,如果该函数调用 QueryInterface()对于 IUnknown一旦被调用,它将立即检索一个不同的指针。

就 COM 而言,这是否合法?当我有一个指向多重继承对象的指针并且我允许隐式向上转换时,我该如何处理这种情况?

最佳答案

COM 没有关于接口(interface)标识的规则,只有对象标识。 QI 的第一条规则是,如果两个接口(interface)指针上的 IID_Unknown 由相同的对象 实现,则它们必须返回相同的指针。您的 QI 实现正确地做到了这一点。

如果没有接口(interface)标识的保证,COM 方法就不能假定它获得了相同的 IUnknown 指针,当它在该指针上调用 QI 时将检索该指针。因此,如果需要证明对象身份,则需要单独的 QI。

关于c++ - 使用隐式转换而不是 QueryInterface() 进行向上转换是否合法且具有多重继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3184030/

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