C++ для начинающих Виртуальные функции Поверхностное знакомство

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

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

С переопределением функции вы скорее всего уже знакомы

Переопределение очень схоже с перегрузкой, но это принципиально разные понятия

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

Код С++ Указатели Классы и переопределение функции

Несмотря на то, что мы проинструктировали компилятор, поменяв указатель на адрес объекта-потомка, произошел вызов метода из базового класса. И в первом и во втором случае на экран вывелось A. В общем, при использовании указателя не произошло переопределения. Иногда программисту требуется написание программы подобного вида, но, как оказывается, возникает вопрос по обеспечению уникального поведения для каждого класса-потомка. Возникает вопрос о том, как обеспечить переопределение функций и почему так срабатывает.

Так срабатывает потому что мы не указали, что класс наследник должен переопределять виртуальную функцию, а указали переопределение обычной. В такой ситуации компилятор считает, что нам нужна та функция, которая встречается первая сверху (имеется ввиду иерархия классов). Про вопрос по переопределению функций. Для начала вспомним, что потомков у класса может быть гораздо больше чем один и у каждого могут быть функции, которые необходимо переопределить. Если использовать вариант, который описан выше, то сколько бы у нас объектов-потомков класса А не было, для всех них будет происходить вызов метода из базового класса, что нас явно не устраивает. На помощь приходит использование виртуальных функций.

Код С++ Указатели Классы и переопределение функции

Теперь при изменении указателя, компилятор выбирает метод именно того потомка, на который указатель указывает. Сколько бы потомков у класса А не было, для каждого из них будет происходить именно тот вызов метода, который нужен. При каждом новом вызове метода Show() С++ каждый раз определяет тип вызываемого объекта, адресуемого указателем и исходя из этого определяет какую версию Show() использовать

Немного нужных сведений:

  • Если в базовом классе есть функция с ключевым словом virtual, то такой класс называется полиморфным, а все функции внутри потомков (которые предполагается переопределить) называются виртуальными.
  • То, какая виртуальная функция будет вызвана определяется во время выполнения программы.
  • Виртуальная функция должна быть членом класса для которого определяется, а не его «другом», но в то же время виртуальная функция может быть другом иного класса
  • Функциям деструкторов разрешается быть виртуальными, а функциям конструкторов нет

Читать дальше: Виртуальные функции Продолжение знакомства Динамический полиморфизм

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Один комментарий: C++ для начинающих Виртуальные функции Поверхностное знакомство

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор вероисповедание программист

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок