Mar*_*tin 5 c++ com static-cast multiple-interface-implem
在内部,作者实现了一个暴露多个接口的类(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);
Run Code Online (Sandbox Code Playgroud)
我从C角度了解到,接口指针只是VTables的指针.所以我认为C++能够使用static_cast返回任何已实现接口的VTable.
这是否意味着以这种方式构造的类在内存中有一堆VTable(IObjectWithSite,IDispatch等)?C++对不同接口上的名称冲突做了什么(它们各自都有QueryInterface,AddRef和Release函数),我可以为每个接口实现不同的方法吗?
是的,有多个v表,每个继承的接口一个.static_cast <>返回它.编译器确保共享继承接口中的公共方法,它使用指向同一函数的指针填充每个v表槽.所以你只需要一个AddRef,Release,QueryInterface的实现.正是你想要的.这些都不是意外.
当coclass使用相同的方法实现多个接口而您不希望提供相同的实现时,这只是一个问题.IConnectionPoint :: Advise()方法是一个臭名昭着的例子.还是DAdvise()?不幸的是,我不记得它与它发生了什么冲突以及它是如何解决的,它被ATL Internals所覆盖.非常好的书btw.
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |