Как реализовать виртуальную функцию на C ++?



Эта статья познакомит вас с еще одной концепцией программирования, а именно с виртуальной функцией в C ++. Концепция будет подкреплена демонстрацией.

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

Итак, давайте начнем с этой статьи о виртуальной функции в C ++.





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

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

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



Правила для виртуальной функции в C ++:

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

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

Что является обязательным?

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

пошаговое руководство по таблице

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



Раннее связывание

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

  • Как мы знаем, мы пишем код на языке высокого уровня
  • Затем компилятор преобразует это в язык низкого уровня, понятный компьютеру, в основном машинный язык во время компиляции.
  • При раннем связывании компилятор напрямую предоставляет адрес инструкции объявления функции инструкции вызова функции.
  • Таким образом, как следует из названия, привязка происходит очень рано, до запуска программы.

пример

#include с использованием пространства имен std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // возврат раннего связывания 0}

Вывод

Вывод - виртуальная функция в C ++ - Edureka

разъяснения ион
В этом примере мы создали указатель на родительский класс Animals. Затем, написав a = & c, указатель «a» начал ссылаться на объект c класса Cats.
a -> sound () - При вызове функции sound (), которая присутствует в обоих классах по указателю 'a', вызывается функция родительского класса, даже если указатель ссылается на объект класса Cats .

Это связано с ранним связыванием. Мы знаем, что «a» - это указатель родительского класса, ссылающийся на объект дочернего класса. Поскольку раннее связывание происходит во время компиляции, поэтому, когда компилятор увидел, что 'a' является указателем родительского класса, он сопоставил вызов с функцией 'sound ()' родительского класса без поиска объекта, указателя на него имеет в виду.

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

Позднее связывание

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

Позднее связывание в вышеуказанной проблеме может быть решено с помощью ключевого слова virtual в базовом классе. Давайте посмотрим, как это происходит, на примере самого выше, но только с добавлением виртуального ключевого слова.

пример

как предотвратить взаимоблокировку в Java
#include с использованием пространства имен std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}

Вывод

Объяснение
Здесь функция sound () базового класса сделана виртуальной, поэтому теперь компилятор выполняет позднее связывание для этой функции. Теперь вызов функции функции sound () будет соответствовать определению функции во время выполнения. Поскольку компилятор теперь определяет указатель «a» как относящийся к объекту «c» производного класса Cats, он вызовет функцию sound () класса Cats.

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

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

Чистая виртуальная функция в C ++ - это виртуальная функция, для которой у нас нет реализации, мы ее только объявляем. Чистая виртуальная функция объявляется путем присвоения 0 в объявлении.

виртуальный пустой звук () = 0

Здесь звук () - это чисто виртуальная функция.

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

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

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

парсинг xml файлов в java

пример

#include using namespace std class Employee // абстрактный базовый класс {virtual int getSalary () = 0 // чистая виртуальная функция} class Employee_1: public Employee {int salary public: Employee_1 (int s) {salary = s} int getSalary () {return salary}} class Employee_2: public Employee {int salary public: Employee_2 (int t) {salary = t} int getSalary () {return salary}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Вывод

Объяснение
Функция getSalary () в классе Employee - это чисто виртуальная функция. Поскольку класс Employee содержит чистую виртуальную функцию, это абстрактный базовый класс.
Поскольку чистая виртуальная функция определена в подклассах, функция «getSalary ()» определена в обоих подклассах класса Employee, то есть в Employee_1 и Employee_2.

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

Пример виртуальной функции

#include с использованием пространства имен std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout функция_2 () точка-> функция_3 () точка-> функция_4 ()}

Вывод

Объяснение
Для вызова функции function_1 () вызывается версия функции базового класса, функция function_2 () переопределяется в производном классе, поэтому вызывается версия производного класса, function_3 () не переопределяется в производном классе и является виртуальной функцией, поэтому вызывается версия базового класса, аналогично function_4 () не переопределяется, поэтому вызывается версия базового класса.

На этом мы подошли к концу статьи о «Виртуальных функциях в C ++». Если вы хотите узнать больше, ознакомьтесь с от Edureka, надежной компании онлайн-обучения. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы обучить вас базовым и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев в этом блоге, и мы свяжемся с вами как можно скорее.