- 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/
我的查询不工作,它总是显示相关的 0。即使针对数据确实存在。 SELECT number, MATCH(number) AGAINST('02' '01' '03' WITH QUERY EXPA
我正在尝试对字段进行全文搜索以匹配字符串的特定部分。考虑一个包含数组值的长字符串,例如 201:::1###193:::5###193:::6###202:::6。 ### 分隔数组元素,::: 分隔
我正在构建一个音乐应用程序。在我的数据库中,我有一个“艺术家”表,与“专辑”表相关,与“轨道”表相关。 我的应用程序的每个用户都可以“喜欢”(竖起大拇指)或“不喜欢”(竖起大拇指)艺术家/专辑/轨道。
我正在使用这个搜索 -> 将 (c1, c2) 与 (">dg*"在 bool 模式下匹配); 我得到了这个列表 1 dgas 2 格卡 3 dgicb 4 天 5 位数 6 dgly 7 总督 8
我想从数据库中找到 date 为“2013-04”的所有记录。 我使用: SELECT date, pastabos FROM aktai WHERE MATCH(uzsakovas) AGAINST
我正在尝试为评论实现一个 upvote/downvote 机制(类似于 reddit 上的 upvote/downvote 机制)。我有一个名为 commentReputation 的单独集合里面的文
我从事安全关键应用程序开发工作。最近,作为一名代码审阅者,我提示如下所示的编码风格,但无法提出强有力的理由反对它。那么反对这种变量冗余/重复的一个很好的论据是什么,我正在寻找可能导致问题或可能失败的测
我有一个全文索引表,其中包含数据系列。没有空格,拼写正确。如何将此查询匹配结果作为分数并按分数按 DESC 顺序显示?我总是得到空集,不知道为什么。 SELECT *, MATCH(MEDIA_TI
编辑:改写问题。 除了不好的做法,还有什么其他原因反对 HTML 中的空段落? 原创: 背景 目前,要在我们的 CMS 中添加漂亮的空格段落,您需要按两次 Enter 键。我不喜欢空洞的段落,因为它们
我正在尝试将对象转换为 Json 字符串。我看到一个 TJson::ObjectToJsonString() 似乎可以满足需求,但似乎不起作用。我在 Delphi 中有确切的代码,没有问题。因此,显然
如果我想为 Linux 开发一个类似注册表的系统,我应该避免哪些 Windows 注册表设计失败? 哪些功能是绝对必要的? 主要问题是什么(安全性、易于配置……)? 我认为 Windows 注册表不是
自从 Adobe AIR 发布以来,我想知道为什么 Java Web Start 过去没有引起更多关注,因为在我看来它似乎非常相似,但 web start 可用的时间要长得多。 主要是因为 Sun
我经常想用一个假设 free_if_heap(void *ptr)函数,因为这会让我无需关心就返回 malloc 的、静态的或堆栈对象。例如 char *foo(int arg) { if (
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我正在研究用 GCC 编译的 ARM C/C++ 代码的性能优化。 CPU 是 Tegra 3。 据我所知标志-mthumb表示生成旧的 16 位 Thumb 指令。在不同的测试中,-marm 的性能
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正要调试别人的代码,我偶然发现了一种处理全局数组的“方式”,我认为这种方式非常糟糕,但第一个使用它的人发誓要这样做。我需要找到反对它的论据。这是简化后的代码(这不是原始代码,只是一个抽象版本) 所以
select col1,col2,col3,col4,col5 from table1 where (col1 like '%keyword%' or col2 like '%keywo
我发现我经常进行递归调用只是为了重新排列参数。 例如,这是我对 endOther from codingbat.com 的解决方案: Given two strings, return true if
首先,我知道在复制文件时,如果缓冲区大小越大,复制过程就会越快。 以下 ruby 脚本用于逐行编写(即缓冲区的大小将取决于行的长度): input,output = ARGV[0], ARGV[1]
我是一名优秀的程序员,十分优秀!