Предположим, класс реализет несколько интерфейсов.
class I1: public IDispatch {...}
class I2: public IDispatch {...}
class CImpl : public СImplementI1, public СImplementI2 {...}
Задача: нужно для каждого интерфеса класса выдать соответствующий ему IDispatch
вот так:
I1 *pI1;
//
...здесь создаем объект типа CImpl, присваиваем pI1 указатель на I1 из объекта
//
I2 *pI2; pI2->QueryInterface(IID_I2, (void**)pI2);
IDispatch pDisp1; pI1->QueryInterface(IID_IDispatch, (void**)pDisp1);
IDispatch pDisp2; pI2->QueryInterface(IID_IDispatch, (void**)pDisp2);
в итоге, как ни крути pDisp1==pDisp2;
потому что в CImpl есть только один виртуальный метод QueryInterface, и сказать ему, из какого интерфеса (I1 или I2) хотят получить IDispatch нет никакой возможности.
В то же время, если использовать аггрегацию, то подобный прием проходит. Потому что существует 2 объекта, 2 разных vtable, и соответственно 2 QueryInterface.
ИМХО, это несправедливо, потому что из-за IDispatch я должен отказываться от множественного наследования.
Может, кто-нибудь знает как побороть проблему?