Разница между виртуальной и чистой виртуальной функцией

Автор: Laura McKinney
Дата создания: 2 Апрель 2021
Дата обновления: 10 Май 2024
Anonim
Виртуальные методы класса c++. Ключевое слово virtual. Ключевое слово override. ООП. C++ #103
Видео: Виртуальные методы класса c++. Ключевое слово virtual. Ключевое слово override. ООП. C++ #103

Содержание


Виртуальная функция и чисто виртуальная функция являются концепциями полиморфизма во время выполнения. Основное различие между ‘виртуальная функция а также «Чисто виртуальная функция» в том, что «виртуальная функция» имеет свое определение в базовом классе, а также наследующие производные классы переопределяют ее. Чистая виртуальная функция не имеет определения в базовом классе, и все наследуемые производные классы должны переопределить ее.

Однако виртуальная функция также называется динамической диспетчеризацией и диспетчеризацией во время выполнения, поскольку вызываемая функция указывается во время выполнения в соответствии с типом используемого объекта.

Полиморфизм поддерживается как языками C ++, так и Java. В Java термин «переопределение» используется вместо «виртуальная функция», поскольку виртуальная функция - это термин C ++.

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Вывод

Сравнительная таблица

Основа для сравненияВиртуальная функцияЧистая виртуальная функция
основнойВиртуальная функция имеет свое определение в базовом классе.Чистая виртуальная функция не имеет определения в базовом классе.
декларациявиртуальное имя_функции (список_параметров) {. , , , .};виртуальное имя_функции (список_параметров) = 0;
Производный классВсе производные классы могут или не могут переопределить виртуальную функцию базового класса.Все производные классы должны переопределять виртуальную функцию базового класса.
эффект

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


Определение виртуальной функции

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

Декларация:

база классов {public: виртуальный тип funt_name (список параметров) {. , , }};

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


Многоуровневое наследование

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

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

Определение чистой виртуальной функции

Как видно выше, если производный класс не переопределяет виртуальную функцию, то используется виртуальная функция, определенная базовым классом. Но что, если базовый класс сам по себе не определяет виртуальную функцию. Часто базовый класс не имеет определения для виртуальной функции, или иногда вы хотите, чтобы все производные классы переопределяли виртуальную функцию.

Чтобы справиться с этими двумя ситуациями, C ++ поддерживает концепцию «Чистая виртуальная функция«. «Чистая виртуальная функция» объявлена ​​в базовом классе, но не имеет определения в базовом классе. Чистая виртуальная функция объявлена ​​следующим образом.

виртуальный тип funct_name (parameter_list) = 0;

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

Абстрактный класс

Класс, который содержит хотя бы одну чистую функцию, называется «абстрактный класс». Нельзя создавать объекты абстрактных классов, но вы можете создавать ссылки и указатели на абстрактные классы. Члены абстрактных классов могут быть доступны через объект производных классов, который наследует абстрактный базовый класс.

Класс, который вы хотите объявить абстрактным, используйте ключевое слово 'Аннотация' напротив 'учебный класс' ключевое слово.

// например абстрактный класс class-name {. , виртуальный тип funct_name (parameter_list) = 0; , , };

  1. Виртуальные функции определенно определены в базовом классе и переопределены (переопределены) в производном классе. С другой стороны, чисто виртуальная функция базового класса особенно не определена в базовом классе
  2. Производный класс при необходимости переопределяет (переопределяет) виртуальную функцию, тогда как в случае чисто виртуальной функции производный класс должен обязательно переопределить чисто виртуальную функцию.
  3. Если производный класс не может переопределить (переопределить) виртуальную функцию, он может использовать виртуальную функцию базового класса. И наоборот, если производный класс не может переопределить чисто виртуальную функцию, возникает ошибка компиляции.
  4. Базовый класс, содержащий виртуальную функцию, может быть создан, т.е. его объект может быть создан. В отличие от этого базовый класс, содержащий чисто виртуальную функцию, то есть абстрактный класс, не может быть создан, поскольку абстрактный класс не полностью определен.

Заметка:
Прототип «виртуальной функции» и «чисто виртуальной функции» остается неизменным на протяжении всей программы.

Вывод:

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