Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос ДН>
ДН>struct MyCoClass : public MyInterface1, public MyInterface2
ДН>{
ДН> // ...
ДН>};
ДН>
ДН>Зачем каждый из MyInterface1, MyInterface2 ... наследовать от IUnknown? Почему не сделать так
ДН>
ДН>struct MyCoClass : public IUnknown, public MyInterface1_no_unknown, public MyInterface2_no_unknown
ДН>{
ДН> // ...
ДН>};
ДН>
Ну, представь что клиент получает указатель на MyInterface1_no_unknown.. И как он будет вызывать AddRef и Release? Без QueryInterface прожить ещё можно, а вот без этих — никак.
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос ДН>Зачем каждый из MyInterface1, MyInterface2 ... наследовать от IUnknown? Почему не сделать так
Трельсен здесь ни при чем.
Каждый интерефейс должен быть унаследован от IUnknown.
Такая вот парадигма.
А иначе тебе придется держать два указателя на объект. IUnknown и Еще какойто.
Все потому, что на объект, как в C++, нельзя сослаться.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос ДН>>Зачем каждый из MyInterface1, MyInterface2 ... наследовать от IUnknown? Почему не сделать так
PE>Трельсен здесь ни при чем. PE>Каждый интерефейс должен быть унаследован от IUnknown. PE>Такая вот парадигма.
PE>А иначе тебе придется держать два указателя на объект. IUnknown и Еще какойто. PE>Все потому, что на объект, как в C++, нельзя сослаться.
Я слегка стормозил... Вопрос следовало сформулировать так — почему нельзя использовать виртуальное наследование? Зачем "плодить" множество копий базовых IUnknown?
А Тре(оэ)льсен поражает своим знанием С++, который похоже в его представлении ограничен VC и создателем его, в его понимании, является мелкософт.
void main()
int main()
void main(int)
void foo(char*...)
Здравствуйте, Дмитрий Наумов, Вы писали:
PE>А иначе тебе придется держать два указателя на объект. IUnknown и Еще какойто. PE>Все потому, что на объект, как в C++, нельзя сослаться.
ДН>Я слегка стормозил... Вопрос следовало сформулировать так — почему нельзя использовать виртуальное наследование? Зачем "плодить" множество копий базовых IUnknown?
Копии не создаются. Любой интерфейс — это только указатель на таблицу вируальных функций.
Поэтому что с виртуальным наследованием, что без него — один хрен.
ДН>А Тре(оэ)льсен поражает своим знанием С++, который похоже в его представлении ограничен VC и создателем его, в его понимании, является мелкософт.
Трельсен написал букварь по программированию ATL и COM.
Поэтому другого не жди.
Если более серьезная литература, читай ее.
Книга эта нужна в первую очередь тем, кто начинает использовать COM.
Вот и все.
Другой альтернативы для начинающих приктически нет.
Дона бокса и Роджерсона Inside ATL мало кто понимает, если не имеет опыта использования COM и ATL.
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Я слегка стормозил... Вопрос следовало сформулировать так — почему нельзя использовать виртуальное наследование? Зачем "плодить" множество копий базовых IUnknown?
Дык. Реализация ком-объекта как C++ класса с множественным наследованием — только один из вариантов. COM можно писать на разных языках, поэтому есть стандарт на бинарную структуру объекта — где у него какие указаетли и т.п. Один из вариантов реализации этого стандарта на C++ это вот такое наследование. А виртуальное не подходит, т.к. там получается другая структура, причём разная у разных компиляторов (наверное).
ДН>
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Тем что он не конст, глаза коробит...
SH>Ясно.. А может это не [in] парметр, а [out] или [in/out]?
Нет, там был [in], это были начальные примеры на С++ без всякого еще СОМ