- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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()
?
最佳答案
AddRef
在 IUnknown
中是纯虚拟的,并且没有其他接口(interface)实现它,所以你的程序中唯一的实现是你在 CMyClass
中编写的那个.那个方法覆盖两个 IInterface1::AddRef
和 IInterface2::AddRef
. IUnknown
没有任何数据成员(例如引用计数),因此菱形问题不会导致您的类容易受到诸如对 AddRef
的不同调用等问题的影响。作用于同一类中的不同数据。
调用 this->AddRef()
将被路由到与 static_cast<IUnknown*>(*ppv)->AddRef()
相同的位置.我认为没有理由采用更冗长的风格。
关于c++ - 有什么理由反对在 QueryInterface() 实现中直接调用 AddRef() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811130/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!