несколько реализаций IDispatch в одном CoClass'е
От: Аноним  
Дата: 21.01.05 14:55
Оценка:
Предположим, класс реализет несколько интерфейсов.
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 я должен отказываться от множественного наследования.
Может, кто-нибудь знает как побороть проблему?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.