我想了解此示例代码关于浏览器辅助对象。

内部,作者实现单个类暴露多个接口(接口IObjectWithSite,IDispatch接口)。

他QueryInterface函数执行以下内容:

if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this);
else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this);
else if (riid == IID_IDispatch) *ppv = static_cast<IDispatch*>(this);

我已经了解到,从C的角度来看,接口指针只是指针的VTable。因此,我把它意味着C ++是能够返回的任何接口使用的static_cast实现的虚函数表的

这是否意味着,以这种方式构造的类的存储器中存有一堆的VTable的(的IObjectWithSite,IDispatch接口等)?什么C ++做的不同接口的名称冲突(他们每个人都有一个QueryInterface,AddRef和Release函数),我可以实现为每个这些不同的方法?

有帮助吗?

解决方案

是,有多个v型表,一个用于每个继承接口。所述的static_cast <>返回它。编译器会确保在继承的接口常用的方法是共享的,它填充每个V表槽与所述的指针相同的功能。所以,你只需要一个实施的AddRef,发布的QueryInterface。只要你想要的。这一切都不是一个意外。

这是有史以来唯一的一个问题,当一个组件类工具与您的不相同的方法多个接口的想给相同的实现。所述的IConnectionPoint ::指教()方法是臭名昭著的例子。抑或是DAdvise()?不幸的是,我不记得是什么发生冲突,以及它是如何解决的,它涵盖ATL内幕。很不错的书顺便说一句。

其他提示

在多重继承,多个Vtables可以像下面的格式排列成序列如果给this指针(它指向第一个字节,01)

[01] [02] [03] [04] [05] [06] [07] [08] [09] [10] [11] [12],点击 [PTR VTableA的] [VTableB的PTR] [VTableC的PTR]

在C ++中,只有1实施将每函数原型多个接口场景生成。 然而,对于正常继承的情况下,超可能已经预先定义的执行和孩子谁覆盖的功能都会有自己的VTable指向不同的内容比母体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top