– это использование композиции и элемента данных для реализации неделегирующих методов
class Car : public ICar
{
LONG m_cRef;
IUnknown *m_pUnk0uter;
public: Car(IUnknown *pUnk0uter);
// non-delegating IUnknown methods
// неделегирующие методы
IUnknown STDMETHODIMP InternalQueryInterface(REFIID, void **);
STDMETHODIMP (ULONG) InternalAddRef(void);
STDMETHODIMP_(ULONG) InternalRelease(void);
// delegating IUnknown methods
// делегирующие методы IUnknown
STDMETHODIMP QueryInterface(REFIID, void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP GetMaxSpeed(*long *pn);
STDMETHODIMP Brake(void);
// composite to map distinguished IUnknown vptr to
// non-delegating InternalXXX routines in main object
// композит для преобразования определенного vptr IUnknown
// в неделегирующие подпрограммы InternalXXX в главном
// объекте
class XNDUnknown : public IUnknown
{ Car* This()
{
return (Car*)((BYTE*)this – offsetof(Car, m_innerUnknown));
}
STDMETHODIMP QueryInterface(REFIID r, void**p)
{
return This()->InternalQueryInterface(r,p);
}
STDMETHODIMP_(ULONG) AddRef(void)
{
return This()->InternalAddRef();
}
STDMETHODIMP_(ULONG) Release(void)
{
return This()->InternalRelease();
}
};
XNDUnknown m_innerUnknown;
// composite instance
// экземпляр композита };
Двоичное размещение этого объекта показано на рис. 4.8. Методы делегирования класса чрезвычайно просты:
STDMETHODIMP Car::QueryInterface(REFIID riid, void **ppv) { return m_pUnkOuter- >QueryInterface(riid, ppv); }
STDMETHODIMP_(ULONG) Car::AddRef(void) { return m_pUnkOuter->AddRef(); }
STDMETHODIMP_(ULONG) Car::Release (void) { return m_pUnkOuter->Release(); }

Эти подпрограммы являются версиями, которые будут заполнять таблицы
Для того чтобы объект можно было использовать в обоих сценариях – агрегирования и автономном – разработчик объекта должен установить свой элемент данных
Car::Car(IUnknown *pUnkOuter)
{
if (pUnkOuter)
// delegate to pUnkOuter
// делегируем в pUnkOuter
m_pUnkOuter = pUnkOuter;
else // delegate to non-delegating self
// делегируем неделегирующему себе m_pUnkOuter = &m_innerUnknown;
}
Разработчик обеспечивает то, что в обоих случаях
Обычные неделегирующие реализации
STDMETHODIMP Car::InternalQueryInterface(REFIID riid, void **ppv)
{
if (riid == IID_IUnknown) *ppv = static_cast<IUnknown*>(&m_innerUnknown);
else if (riid = IID_IVehicle) *ppv = static_cast<IVehicle*>(this);
else if (riid == IID_ICar) *ppv = static_cast<ICar*>(this);
else return (*ppv = 0), E_NOINTERFACE;
((IUnknown*)*ppv)->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) Car::InternalAddRef(void)
{
return InterlockedIncrement(&m_cRef);
}