Lors de l'implémentation IUnknown::QueryInterface()
en C++, il existe plusieurs mises en garde avec la manipulation de pointeurs. Par exemple, lorsque la classe implémente plusieurs interfaces (d'héritage multiple) explicit upcasts are necessary:Y a-t-il une raison de ne pas appeler directement AddRef() dans l'implémentation de QueryInterface()?
class CMyClass : public IInterface1, public IInterface2 {
};
//inside CMyClass::QueryInterface():
if(iid == __uuidof(IUnknown)) {
*ppv = static_cast<IInterface1*>(this); // upcast in order to properly adjust the pointer
//call Addref(), return S_OK
}
La raison de upcast est tout à fait clair dans plusieurs scénarios d'héritage. Cependant tous ici et là, je vois aussi ce qui suit:
static_cast<IUnknown*>(*ppv)->AddRef();
au lieu d'invoquer simplement AddRef()
à l'intérieur QueryInterface()
mise en œuvre.
Y at-il une raison pour laquelle je devrais faire le moulage de la valeur précédemment copiée dans ppv
au lieu de simplement appeler AddRef()
sur l'objet courant?
Serait-il possible pour vous d'afficher la définition de la classe IUnknown? – mukeshkumar
@hype: Bien sûr. http://msdn.microsoft.com/en-us/library/ms680509(VS.85).aspx – sharptooth