Информатика и технология программирования


Назад: Си++ = Си + классы + объектно-ориентированное


Множественным наследованием называется процесс создания производного класса из двух и более базовых. В этом случае производный класс наследует данные и функции всех своих базовых предшественников. Существенным для реализации множественного наследования является то, что адреса объектов второго и последующих базовых классов не совпадают с адресом объекта производного класса. Этот факт должен учитываться транслятором при преобразовании указателя на производный класс в указатель на базовый и наоборот:


class d : public a,public b, public c { };
d D1;
pd = &#38D1; // &#35define db sizeof(a)


pa = pd; // &#35define dc sizeof(a)+sizeof(b)


pb = pd; // pb = (char*)pd + db


pc = pd; // pc = (char*)pd + dc










pc

Такое действие выполняется компилятором как явно при преобразовании в программе типов указателей, так и неявно, когда в объекте производного класса наследуется функция из второго и последующих базовых классов. Для вышеуказанного примера при определении в классе bb функции f() и ее наследовании в классе "d" вызов D1.f() будет реализован следующим образом:


this = &#38D1; // Указатель на объект производного класса


this = (char*)this + db // Смещение к объекту базового класса


b::f(this); // Вызов функции в базовом классе


Механизм виртуальных функций при множественном наследовании имеет свои особенности. Во-первых, на каждый базовый класс в производном классе создается свой массив виртуальных функций (в нашем случае -для aa в d, для bb в d и для cc в d ). Во-вторых, если функция базового класса переопределена в производном, то при ее вызове требуется преобразовать указатель на объект базового класса в указатель на объект производного. Для этого транслятор включает соответствующий код, корректирующий значение this в виде "заплаты", передающей управление командой перехода к переопределяемой функции, либо создает отдельные таблицы смещений.




Начало  Назад  Вперед



Книжный магазин