Виртуальные функции
Связывание это сопоставление вызова функции с телом функции. Для обычных функций−член связывание выполняется на этапе трансляции до запуска программы. Такое связывание называют «ранним», или статическим. При наследовании обычной функции−член его поведение не меняется в наследнике. Однако бывает необходимо, чтобы поведение некоторых функций−член базового класса и классов−наследников отличались. Чтобы добиться разного поведения в зависимости от типа, необходимо объявить функцию−метод виртуальной; в C++ это делается с помощью ключевого слова virtual. Виртуальные функции в совокупности с принципом подстановки обеспечивают механизм «позднего» (отложенного) или динамического связывания, которое работает во время выполнения программы.
Класс, в котором определены виртуальные функции (хотя бы одна), называется полиморфным классом.
Ключевое слово virtual можно писать только в базовом классе — это достаточно сделать в объявлении функции. Даже если определение писать без слова virtual, функция все равно будет считаться виртуальной. Правила описания и использования виртуальных функций−методов следующие.
1. Виртуальная функция может быть только методом класса.
2. Любую перегружаемую операцию−метод класса можно сделать виртуальной, например операцию присваивания или операцию преобразования типа.
3. Виртуальная функция наследуется.
4. Виртуальная функция может быть константной.
5. Если в базовом классе определена виртуальная функция, то функция−член производного класса с таким же именем и прототипом (включая и тип возвращаемого значения, и константность функции−член) автоматически является виртуальным (слово virtual указывать необязательно) и замещает функцию−член базового класса.
6. Статические методы не могут быть виртуальными.
7. Конструкторы не могут быть виртуальными.
Деструкторы могут (чаще — должны) быть виртуальными — это гарантирует корректное освобождение памяти через указатель базового класса.
Внутри конструкторов и деструкторов динамическое связывание не работает, хотя вызов виртуальных функций не запрещен. В конструкторах и деструкторах всегда вызывается «родная» функция класса.
Виртуальные функции−член можно перегружать и переопределять (в наследниках) с другим списком аргументов. Если виртуальная функция переопределена с другим списком аргументов, она замещает (скрывает) родительские методы. Константный метод считается отличным от неконстантного метода с таким же прототипом.
Родительские методы можно сделать доступными в классе−наследнике при помощи using−объявления.
Разрешается при переопределении виртуальной функции изменить только тип возвращаемого значения, если это указатель или ссылка.
Дата добавления: 2015-07-30; просмотров: 1285;