IUnknown::QueryInterface()
を実装する典型的な方法は以下の通りである:多重継承シナリオにおける適切なポインタ調整のためにここでDynamicIncastをQueryInterface実装で使用する必要はありませんか?
if(iid == __uuidof(IInterfaceN)) {
*ppv = static_cast<IInterfaceN>(this);
//call Addref(), return S_OK
}
今static_cast
is necessary次のサポートされている各インタフェースIDにif-else-if
のチェーンを使用して行います。
しばらくして、代わりにdynamic_cast
を使用する実装があります。 IMOは時間の無駄です - 結果は同じになります、それはちょうど時間がかかり、実装を強調します。
dynamic_cast
を使用してどのような場合には、IUnknown::QueryInterface()
実装のvoid**
パラメータにそれをコピーする前にthis
ポインタをキャストするために実際に必要がありますか?
Emm ...このような階層の簡単な例を教えてください。 – sharptooth
'Base'と' Derived1' ... 'DerivedN'クラスのセットを仮定します。ここで' Derived'クラスはそれぞれ 'Interface1' ...' InterfaceM'のランダムサブセットを実装しています。 'Base :: QueryInterface'では、' this'が要求されたインターフェースに対して 'dynamic_cast'になるかどうかを調べます。 – MSalters
さて、私はそれを見て、それは有効な例ですが、少し強くなっています。それを答えに含めてください。 – sharptooth