Виртуальные функции С++
Виртуальные функции C++
В этом уроке мы узнаем о виртуальной функции C++ и ее использовании с помощью примеров.
Виртуальная функция — это функция-член в базовом классе, которую мы ожидаем переопределить в производных классах.
По сути, виртуальная функция используется в базовом классе, чтобы гарантировать, что функция переопределена. . Это особенно относится к случаям, когда указатель базового класса указывает на объект производного класса.
Например, рассмотрим код ниже:
01
Позже, если мы создадим указатель 06
введите, чтобы указать на объект 19
class и вызовите 25
функция, она вызывает функцию 39
функция 46
класс.
Другими словами, функция-член 57
не переопределяется.
10пре>Чтобы этого избежать, мы объявляем
62
функция79
класс как виртуальный с помощью89
ключевое слово.28Виртуальные функции являются неотъемлемой частью полиморфизма в C++. Чтобы узнать больше, ознакомьтесь с нашим руководством по полиморфизму C++.
<час>Пример 1:виртуальная функция C++
32Вывод
40
Здесь мы объявили
98
функция101
как111
.Таким образом, эта функция переопределяется, даже когда мы используем указатель
<рисунок> <час>125
. тип, который указывает на139
объект производный1 .Идентификатор переопределения C++
C++ 11 дал нам новый идентификатор
144
это очень полезно, чтобы избежать ошибок при использовании виртуальных функций.Этот идентификатор указывает функции-члены производных классов, которые переопределяют функцию-член базового класса.
Например,
58Если мы используем прототип функции в
155
class и определить эту функцию вне класса, то мы используем следующий код:61<час>Использование переопределения C++
При использовании виртуальных функций возможны ошибки при объявлении функций-членов производных классов.
Использование
164
идентификатор предлагает компилятору отображать сообщения об ошибках, когда эти ошибки сделаны.В противном случае программа просто скомпилируется, но виртуальная функция не будет переопределена.
Некоторые из этих возможных ошибок:
- Функции с неверными именами: Например, если виртуальная функция в базовом классе называется
177
, но мы случайно назвали переопределяющую функцию в производном классе как187
. - Функции с разными типами возврата: Если виртуальная функция, скажем,
190
тип, но функция в производном классе имеет тип204
тип. - Функции с разными параметрами: Если параметры виртуальной функции и функций в производных классах не совпадают.
- В базовом классе не объявлена виртуальная функция.
Использование виртуальных функций C++
Предположим, у нас есть базовый класс 215
и производные классы 226
и 238
.
Предположим, что у каждого класса есть элемент данных с именем type. . Предположим, что эти переменные инициализированы через соответствующие конструкторы.
73
Теперь предположим, что наша программа требует от нас создания двух 247
функции для каждого класса:
253
чтобы вернуть значение type266
чтобы напечатать значение type
Мы могли бы создать обе эти функции в каждом классе отдельно и переопределить их, что будет долго и утомительно.
Или мы могли бы сделать 270
виртуальный в 283
класс, затем создайте один отдельный 297
функция, которая принимает указатель 306
введите в качестве аргумента. Затем мы можем использовать эту единственную функцию для переопределения виртуальной функции.
89
Это сделает код короче. , очиститель и менее повторяющиеся .
<час>Пример 2:Демонстрация виртуальной функции C++
99
Вывод
107
Здесь мы использовали виртуальную функцию 314
и 320
указатель ani во избежание повторения 332
функция в каждом классе.
114
В 342
, мы создали 3 352
указатели для динамического создания объектов 363
, 370
и 388
классы.
129
Затем мы вызываем 390
используйте эти указатели:
- Когда
406
вызывается, указатель указывает на418
объект. Итак, виртуальная функция в428
класс выполняется внутри431
. - Когда
442
вызывается, указатель указывает на452
объект. Таким образом, виртуальная функция переопределяется, а функция461
выполняется внутри475
. - Когда
488
вызывается, указатель указывает на497
объект. Таким образом, виртуальная функция переопределяется, а функция504
выполняется внутри510
.
Язык C