В чём разница?
Ищем и находим разницу во всём

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

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

Полиморфизм является важной концепцией ООП. Это позволяет объекту принимать различные формы. Существует два типа полиморфизма, называемых ранним связыванием и поздним связыванием. C ++ — это язык программирования, который поддерживает ООП. Следовательно, программист может реализовать концепции полиморфизма, используя C ++.

Содержание

  1. Что такое виртуальная функция — определение, функциональность
  2. Что такое чистая виртуальная функция — определение, функциональность
  3. Разница между виртуальной функцией и чистой виртуальной функцией — сравнение основных различий

Ключевые определения

ООП (объектно-ориентированное программирование) , Чистая Виртуальная Функция, Виртуальная Функция

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

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

Что такое виртуальная функция

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

Программа на C ++
Программа на C ++

В приведенной выше программе класс A имеет открытый метод, называемый display. Класс B наследует класс A. У него есть метод с именем display. Оба метода имеют одинаковые имена, но имеют разные реализации. В основном методе «a» является указателем, а «b» является объектом типа B. Тогда «a» присваивается адрес b. Наконец, программист может вызвать метод отображения, используя «а». Здесь мы можем заметить, что выходные данные показывают метод отображения класса A. Даже если программист назначил адрес ‘b’ для ‘a’ (b = & a), он все равно печатает метод отображения класса A. Это происходит из-за статической связи. Другими словами, вызов функции фиксируется перед выполнением программы. Функция отображения устанавливается во время компиляции. Мы также называем это ранним связыванием.

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

C ++ программа с виртуальной функцией
C ++ программа с виртуальной функцией

Теперь функция отображения в классе A является виртуальной функцией. Мы можем заметить, что на выходе показан метод отображения класса B. Предпочтение отдается типу B. Другими словами, функция вызывается в зависимости от объекта. Следовательно, это динамическое или позднее связывание.

 Что такое чистая виртуальная функция

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

C ++ программа с чисто виртуальной функцией
C ++ программа с чисто виртуальной функцией

Подкласс должен предоставить определение виртуальной функции базового класса. Нет необходимости в определении функции для функции отображения в классе A. Следовательно, у нее нет определения функции. = 0 указывает компилятору, что функция не имеет определения. Поэтому функция отображения в классе A называется чисто виртуальной функцией. Поскольку класс A имеет чисто виртуальную функцию, он называется абстрактным базовым классом.

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

Определение

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

Определение функции

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

Производный класс

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

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

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

Итоги

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

Заключение

Программист может писать виртуальные функции на C ++. Чистая виртуальная функция — это специальная виртуальная функция. Основное различие между виртуальной функцией и чисто виртуальной функцией заключается в том, что виртуальная функция — это функция в базовом классе, которая объявлена ​​с использованием ключевого слова virtual, тогда как чисто виртуальная функция — это виртуальная функция в базовом классе без определения функции.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *