Виртуальные функции

Связывание это сопоставление вызова функции с телом функции. Для обычных функций−член связывание выполняется на этапе трансляции до запуска программы. Такое связывание называют «ранним», или статическим. При наследовании обычной функции−член его поведение не меняется в наследнике. Однако бывает необходимо, чтобы поведение некоторых функций−член базового класса и классов−наследников отличались. Чтобы добиться разного поведения в зависимости от типа, необходимо объявить функцию−метод виртуальной; в C++ это делается с помощью ключевого слова virtual. Виртуальные функции в совокупности с принципом подстановки обеспечивают механизм «позднего» (отложенного) или динамического связывания, которое работает во время выполнения программы.

Класс, в котором определены виртуальные функции (хотя бы одна), называется полиморфным классом.

Ключевое слово virtual можно писать только в базовом классе — это достаточно сделать в объявлении функции. Даже если определение писать без слова virtual, функция все равно будет считаться виртуальной. Правила описания и использования виртуальных функций−методов следующие.

1. Виртуальная функция может быть только методом класса.

2. Любую перегружаемую операцию−метод класса можно сделать виртуальной, например операцию присваивания или операцию преобразования типа.

3. Виртуальная функция наследуется.

4. Виртуальная функция может быть константной.

5. Если в базовом классе определена виртуальная функция, то функция−член производного класса с таким же именем и прототипом (включая и тип возвращаемого значения, и константность функции−член) автоматически является виртуальным (слово virtual указывать необязательно) и замещает функцию−член базового класса.

6. Статические методы не могут быть виртуальными.

7. Конструкторы не могут быть виртуальными.

Деструкторы могут (чаще — должны) быть виртуальными — это гарантирует корректное освобождение памяти через указатель базового класса.

Внутри конструкторов и деструкторов динамическое связывание не работает, хотя вызов виртуальных функций не запрещен. В конструкторах и деструкторах всегда вызывается «родная» функция класса.

Виртуальные функции−член можно перегружать и переопределять (в наследниках) с другим списком аргументов. Если виртуальная функция переопределена с другим списком аргументов, она замещает (скрывает) родительские методы. Константный метод считается отличным от неконстантного метода с таким же прототипом.

Родительские методы можно сделать доступными в классе−наследнике при помощи using−объявления.

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








Дата добавления: 2015-07-30; просмотров: 1309;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.