ранее, следующий код является корректной реализацией QueryInterface : STDMETHODIMP
PugCat::QueryInterface(REFIID riid, void **ppv)
{
assert(ppv != 0);
// or return EPOINTER in production
// или возвращаем EPOINTER в реальный продукт
if (riid == IIDIPug) *ppv = staticcast<IPug*>(this);
else if (riid == IIDIDog) *ppv = staticcast<IDog*>(this);
else if (riid == IIDIAnimal)
// cat or pug?
// кот или мопс?
*ppv == staticcast<IDog*>(this);
else if (riid == IIDIUnknown)
// cat or pug?
// кот или мопс?
*ppv = staticcast<IDog*>(this);
else if (riid == IIDICat) *ppv = staticcast<ICat*>(this);
else
{
// unsupported interface
// неподдерживаемый интерфейс
*ppv = 0;
return ENOINTERFACE;
}
// if we reach this point, *ppv is non-null
// and must be AddRef'ed (guideline A2)
// если мы дошли до этого места, то *ppv ненулевой
// и должен быть обработан AddRef'ом ( принцип A2)
reinterpretcast<IUnknown*>(*ppv)->AddRef();
return SOK;
}
Использование staticcast более предпочтительно, чем традиционные приведения типа в стиле С:
*ppv = (IPug*)this;