Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация интерфейсов COM, множественное наследование 
V
    Опции темы
GoldFinch
Дата 24.12.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Как в C++ реализуется множественное наследование от интерфейсов COM?

Допустим у нас есть класс, который наследует от двух интерфейсов
Как будет выглядеть таблица виртуальных методов (VMT), и как будет происходить доступ к данным?

Если у нас простое наследование, то вызывающая сторона, используя указатель pFoo на объект с интерфейсом IFoo, по известному ей смещению в VMT вызывает метод, передавая ему pFoo как this, и этот метод получает данные своего объекта через this по известным ему смещениям относительно this.

А если у нас множественное наследование, и при вызове вызывающая сторона знает только об одном интерфейсе,
она по прежнему будет передавать как this указатель на тот интерфейс о котором она знает.

Значит при этом будет несколько VMT, но что при этом происходит с данными?

Будет ли там структура
Код

class Foo : IBase1, IBase2
{
    void* VMT_IBase1;
    void* VMT_IBase2;
    T1 field1;
    T2 field2;
.......
};

Получается что в методах одного интерфейса к полю объекта будут обращаться по одному смещению,
а в методах другого интерфейса к тому же полю будут обращаться по одному смещению?

Или все организуется как-то еще?
PM MAIL ICQ   Вверх
xvr
Дата 24.12.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(GoldFinch @ 24.12.2009,  17:17)
Как в C++ реализуется множественное наследование от интерфейсов COM?

Так же, как и множественное наследование от всего остального  smile 

Цитата

Допустим у нас есть класс, который наследует от двух интерфейсов
Как будет выглядеть таблица виртуальных методов (VMT), и как будет происходить доступ к данным?
Таблиц будет две, данные будут общими

Цитата

Значит при этом будет несколько VMT, но что при этом происходит с данными?

Будет ли там структура
Код

class Foo : IBase1, IBase2
{
    void* VMT_IBase1;
    void* VMT_IBase2;
    T1 field1;
    T2 field2;
.......
};

Получается что в методах одного интерфейса к полю объекта будут обращаться по одному смещению,
а в методах другого интерфейса к тому же полю будут обращаться по одному смещению?
У интерфейсов (раз уж разговор зашел о них) данных нет, только указатель на VMT
Цитата

Или все организуется как-то еще?
В общем случае родительские объекты располагаются в наследнике по порядку. Первое поле в каждом родителе - указатель на его VMT. VMT самого первого родителя содержит так же методы и самого потомка (если он добавил новые виртуальные функции). Дополнительные поля самого наследника располагаются после всех родителей.
При взятии указателя на любого родителя this потомка корректируется, что бы корректно указывать на начало родителя внутри потомка. При вызове виртуального метода по такому указателю this перемещается (внутри метода) обратно, на начало потомка.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.