c++ - 有什么理由反对在 QueryInterface() 实现中直接调用 AddRef() 吗?

标签 c++ visual-c++ com interop com-interop

在 C++ 中实现 IUnknown::QueryInterface() 时,有几个关于指针操作的注意事项。例如,当类实现多个接口(interface)时(多重继承)explicit upcasts are necessary :

class CMyClass : public IInterface1, public IInterface2 { 
}; 

//inside CMyClass::QueryInterface():
if( iid == __uuidof( IUnknown ) ) { 
     *ppv = static_cast<IInterface1*>( this ); // upcast in order to properly adjust the pointer
     //call Addref(), return S_OK 
} 

upcast 的原因在多继承场景下就很清楚了。然而,我也时不时地看到以下内容:

static_cast<IUnknown*>( *ppv )->AddRef();

而不是简单地从 QueryInterface() 实现内部调用 AddRef()

我是否应该将之前复制到 ppv 中的值进行强制转换,而不是仅仅在当前对象上调用 AddRef()

最佳答案

AddRefIUnknown 中是纯虚拟的,并且没有其他接口(interface)实现它,所以你的程序中唯一的实现是你在 CMyClass 中编写的那个.那个方法覆盖两个 IInterface1::AddRefIInterface2::AddRef . IUnknown没有任何数据成员(例如引用计数),因此菱形问题不会导致您的类容易受到诸如对 AddRef 的不同调用等问题的影响。作用于同一类中的不同数据。

调用 this->AddRef()将被路由到与 static_cast<IUnknown*>(*ppv)->AddRef() 相同的位置.我认为没有理由采用更冗长的风格。

关于c++ - 有什么理由反对在 QueryInterface() 实现中直接调用 AddRef() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811130/

相关文章:

c++ - vector::erase with pointer 成员

c++ - Windows 图形用户界面 C++ 编程

com - 如何判断是否已经为进程调用了 CoInitializeSecurity?

c++ - 你如何理解一大段代码?

c++ - 嵌套模板类特化的语法

php - 我需要哪个选项来使用 HHVM 编译 php 代码

C++ 使用外部文件中的变量

c++ - 从 CString 到 char*/TCHAR* 的转换

c++ - 在 VB6 中使用 IUnknown 派生的 C++ COM 对象

c++ - DirectShow 示例过滤器 : How to Use?