【发布时间】:2011-03-03 08:01:01
【问题描述】:
我正在尝试了解 this example code 关于浏览器助手对象的信息。
在内部,作者实现了一个暴露多个接口(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。
这是否意味着以这种方式构造的类在内存中有一堆 VTable(IObjectWithSite、IDispatch 等)? C++ 如何处理不同接口上的名称冲突(它们每个都有一个 QueryInterface、AddRef 和 Release 函数),我可以为它们中的每一个实现不同的方法吗?
【问题讨论】:
标签: c++ com static-cast multiple-interface-implem