Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > реализация интерфейсов COM


Автор: GoldFinch 24.12.2009, 17:17
Как в 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;
.......
};

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

Или все организуется как-то еще?

Автор: xvr 24.12.2009, 18:24
Цитата(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 перемещается (внутри метода) обратно, на начало потомка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)