Объектно-ориентированное программирование - Учебное пособие (А.А. Хусаинов)

5.3. техническая реализация виртуальных функций

 

Совокупность классов и подклассов, в которых определяется и переопределяется виртуальная функция, называется полиморфическим кластером этой виртуальной функции.

Обычную составную функцию также можно переопределить в наследуемых классах. Однако без атрибута virtual такая виртуальная функция будет связана с вызовом на этапе компиляции. Атрибут virtual гарантирует позднее связывание в пределах полиморфического кластера.

Чтобы добиться позднего связывания для объекта, его нужно объявить как указатель или ссылку на объект соответствующего класса. Для открытых производных классов (public) указатели и ссылки на объекты этих классов совместимы с указателями и ссылками на объекты базового класса.

Объект Си++ представляет собой непрерывный участок памяти. Указатель на такой объект содержит адрес этого участка. Вызов составной функции транслируется в обычный вызов функции с дополнительным аргументом, содержащим указатель на объект. Например:

 

class Name *object;

Object -> message(10);

 

преобразуется в

 

className_message(object, 10);

 

При создании объектов производных классов их поля сцепляются с полями родительских классов. Эту функцию выполняет компилятор.

Виртуальные функции реализованы с использованием таблиц функций. Таблица виртуальных функций virtual_table  содержит составные функции каждого класса, принадлежащего полиморфическому кластеру. Указатель на эту таблицу имеют все объекты классов и производных классов полиморфического кластера. Компилятор преобразует вызов виртуальной функции через таблицу virtual_table.

Например, если класс Third имеет виртуальную функцию out(), то объявление объекта с помощью указателя и вызов

 

Third *c; c -> out();

 

компилируется в

 

(*(c -> virtual_table [2])) (c, );

 

если переопределенная функция имеет в таблице виртуальных функций индекс 2.