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


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


Тем не менее, если функция является полиморфной, то при вызове ее по указателю на объект базового класса она должна идентифицировать его производный класс и вызвать переопределенную функцию именно для этого класса:


p[0]-&#62f(); // вызов b::f() для B1


p[1]-&#62f(); // вызов c::f() для C1


p[2]-&#62f(); // вызов a::f() для A1


for (i=0; i&#60=2; i++) // вызов b::f(),c::f(),a::f()


p[i]-&#62f(); // в зависимости от типа объекта


В Си++ полиморфная функция называется ВИРТУАЛЬНОЙ ФУНКЦИЕЙ.

Наиболее содержательным синонимом к термину полиморфная (виртуальная) функция является термин l " многоликая" . Действительно создается этот механизм виртуальной функции создает иллюзию функции " единой во многих лицах" - в каждом из производных классов. В то же время базовый класс позволяет объединить эти все разнородные функции под одним общим началом - объектом базового класса, включенным во все производные. Объект базового класса должен быть доступен через указатель только по той причине, что это единственный в Си механизм, позволяющий ссылаться на объекты неопределенного вида (объект одного из производных классов).

Таким образом, если при преобразовании типа " указатель на производный класс" к типу " указатель на базовый класс" происходит потеря информации о типе объекта производного класса, то при вызове виртуальной функции происходит обратный процесс неявного восстановления типа объекта.

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


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



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