我正在尝试了解有关浏览器帮助程序对象的示例代码。
在内部,作者实现了一个暴露多个接口(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 函数),我可以为每个接口实现不同的方法吗?