假设我的 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/