ブラウザヘルパーオブジェクトに関するこのサンプルコードを理解しようとしています。
内部では、作成者は複数のインターフェイス(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関数があります)での名前の衝突をどのように処理しますか?これらのそれぞれに異なるメソッドを実装できますか?