gpt4 book ai didi

c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?

转载 作者:可可西里 更新时间:2023-11-01 09:42:43 25 4
gpt4 key购买 nike

假设我的 COM 对象实现了两个或多个 COM 接口(interface):

class CMyClass : public IPersistFile, public IPersistStream {
};

在实现 QueryInterface() 时,我需要能够返回一个 IUnknown* 指针。由于两个基本接口(interface)都派生自 IUnknown,因此我不能隐式地向上转换——这样的向上转换是不明确的。要显式向上转换,我需要使用以下两种方式之一:

 if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}

 if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}

看起来唯一的要求是,每当对对象调用 QI() 时,它每次都会返回相同的指针,如果我选择任何强制转换并坚持使用,我就满足了该要求。

我应该选择哪个 upcast,为什么?

最佳答案

Mark Ransom 已经给出了正确的答案 - 任何答案都可以,只要它是一致的 - 但选择第一个有一个小优势。由于布局规则,第一个界面的IUnknown*会指向对象的开头。任何其他 IUnknown* 将指向对象中其他地方的后续 vtable 指针。出于调试目的,了解对象在内存中的起始位置非常有用。

关于c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742329/

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