Зачем все наследовать от IUnknown
От: Дмитрий Наумов  
Дата: 10.04.03 12:00
Оценка:
Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос
struct MyCoClass : public MyInterface1, public MyInterface2
{
    // ...
};


Зачем каждый из MyInterface1, MyInterface2 ... наследовать от IUnknown? Почему не сделать так

struct MyCoClass : public IUnknown, public MyInterface1_no_unknown, public MyInterface2_no_unknown
{
    // ...
};
... << RSDN@Home 1.0 beta 6a >>
Re: Зачем все наследовать от IUnknown
От: SergH Россия  
Дата: 10.04.03 12:09
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос

ДН>
ДН>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 прожить ещё можно, а вот без этих — никак.
Делай что должно, и будь что будет
Re: Зачем все наследовать от IUnknown
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.04.03 12:09
Оценка: 9 (1)
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Только начинаю с этим разбираться, читаю Троэльсена, мать его, посему такой ламерский вопрос

ДН>Зачем каждый из MyInterface1, MyInterface2 ... наследовать от IUnknown? Почему не сделать так

Трельсен здесь ни при чем.
Каждый интерефейс должен быть унаследован от IUnknown.
Такая вот парадигма.

А иначе тебе придется держать два указателя на объект. IUnknown и Еще какойто.
Все потому, что на объект, как в C++, нельзя сослаться.
Re[2]: Зачем все наследовать от IUnknown
От: Дмитрий Наумов  
Дата: 10.04.03 12:22
Оценка:
Здравствуйте, 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*...)


...и это тока начало книги
... << RSDN@Home 1.0 beta 6a >>
Re[3]: Зачем все наследовать от IUnknown
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.04.03 13:10
Оценка: 10 (1) -1
Здравствуйте, Дмитрий Наумов, Вы писали:

PE>А иначе тебе придется держать два указателя на объект. IUnknown и Еще какойто.

PE>Все потому, что на объект, как в C++, нельзя сослаться.

ДН>Я слегка стормозил... Вопрос следовало сформулировать так — почему нельзя использовать виртуальное наследование? Зачем "плодить" множество копий базовых IUnknown?


Копии не создаются. Любой интерфейс — это только указатель на таблицу вируальных функций.
Поэтому что с виртуальным наследованием, что без него — один хрен.

ДН>А Тре(оэ)льсен поражает своим знанием С++, который похоже в его представлении ограничен VC и создателем его, в его понимании, является мелкософт.


Трельсен написал букварь по программированию ATL и COM.
Поэтому другого не жди.
Если более серьезная литература, читай ее.

Книга эта нужна в первую очередь тем, кто начинает использовать COM.
Вот и все.

Другой альтернативы для начинающих приктически нет.
Дона бокса и Роджерсона Inside ATL мало кто понимает, если не имеет опыта использования COM и ATL.
Re[3]: Зачем все наследовать от IUnknown
От: SergH Россия  
Дата: 10.04.03 14:02
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Я слегка стормозил... Вопрос следовало сформулировать так — почему нельзя использовать виртуальное наследование? Зачем "плодить" множество копий базовых IUnknown?


Дык. Реализация ком-объекта как C++ класса с множественным наследованием — только один из вариантов. COM можно писать на разных языках, поэтому есть стандарт на бинарную структуру объекта — где у него какие указаетли и т.п. Один из вариантов реализации этого стандарта на C++ это вот такое наследование. А виртуальное не подходит, т.к. там получается другая структура, причём разная у разных компиляторов (наверное).

ДН>
...
ДН>void foo(char*...)
ДН>


А чем тебе char* не угодил?
Делай что должно, и будь что будет
Re[4]: Зачем все наследовать от IUnknown
От: Дмитрий Наумов  
Дата: 10.04.03 14:33
Оценка:
Здравствуйте, SergH, Вы писали:

void foo(char*...)


SH>А чем тебе char* не угодил?


Тем что он не конст, глаза коробит...
... << RSDN@Home 1.0 beta 6a >>
Re[5]: Зачем все наследовать от IUnknown
От: SergH Россия  
Дата: 10.04.03 14:36
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Тем что он не конст, глаза коробит...


Ясно.. А может это не [in] парметр, а [out] или [in/out]?
Делай что должно, и будь что будет
Re[4]: Зачем все наследовать от IUnknown
От: WolfHound  
Дата: 10.04.03 15:59
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Поэтому что с виртуальным наследованием, что без него — один хрен.

Я лучше помолчу...
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Зачем все наследовать от IUnknown
От: Дмитрий Наумов  
Дата: 10.04.03 18:28
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>>Тем что он не конст, глаза коробит...


SH>Ясно.. А может это не [in] парметр, а [out] или [in/out]?


Нет, там был [in], это были начальные примеры на С++ без всякого еще СОМ
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.