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


Двоичное дерево - часть 10


То же самое произойдет, если обрабатывать массив указателей в цикле:


p[0]-&#62f(); // Вызов a::f()


p[1]-&#62f(); // во всех трех случаях


p[2]-&#62f(); // по указателю на объект базового класса


for (i=0; i&#60=2; i++)
p[i]-&#62f();

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


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

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

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


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