Виртуальные функции С++
Виртуальные функции 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Если мы используем прототип функции в
155class и определить эту функцию вне класса, то мы используем следующий код: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
<час>