Бьерн Страуструп.
Язык программирования С++
41
T * p;
где T - класс shape или производный от него класс. Тогда транслятор видит, что класс объекта, на
который настроен указатель p, действительно имеет функцию rotate(), а
функция имеет параметр типа
int. Значит, p->rotate(45) корректное выражение.
Поскольку shape::rotate() была описана как виртуальная функция, нужно использовать механизм вызова
виртуальной функции. Чтобы узнать, какую именно из функций rotate следует вызвать, нужно до вызова
получить из
объекта некоторую служебную информацию, которая была помещена туда при его
создании. Как только установлено, какую функцию надо вызвать, допустим circle::rotate, происходит ее
вызов с уже упоминавшимся контролем типа. Обычно в качестве служебной информации используется
таблица адресов функций, а транслятор преобразует имя rotate в индекс этой таблицы. С учетом этой
таблицы объект типа shape можно представить так:
center
vtbl:
color &X::draw
&Y::rotate
...
...
Функции из таблицы виртуальных функций vtbl позволяют правильно работать с объектом даже в тех
случаях, когда в вызывающей функции неизвестны ни таблица vtbl, ни расположение данных в части
объекта, обозначенной ... . Здесь как X и Y обозначены имена классов, в которые входят вызываемые
функции. Для объекта circle оба имени X и Y есть circle. Вызов виртуальной
функции может быть по сути
столь же эффективен, как вызов обычной функции.
Достарыңызбен бөлісу: