Я пытаюсь понять этот пример кода относительно объектов Browser Helper.
Внутри автор реализует один класс, который предоставляет несколько интерфейсов (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 указатели интерфейса - это просто указатели на VTables. Поэтому я понимаю, что C ++ способен возвращать VTable любого реализованного интерфейса, используя static_cast.
Значит ли это, что класс, созданный таким образом, имеет в памяти кучу VTables (IObjectWithSite, IDispatch и т. Д.)? Что делает C ++ с конфликтами имен на разных интерфейсах (у каждого из них есть функции QueryInterface, AddRef и Release), могу ли я реализовать разные методы для каждого из них?