logo

Віртуальна функція C++

  • Віртуальна функція C++ — це функція-член базового класу, яку ви перевизначаєте в похідному класі. Він оголошується за допомогою ключового слова virtual.
  • Він використовується, щоб сказати компілятору виконати динамічне зв’язування або пізнє зв’язування функції.
  • Існує необхідність використовувати єдиний покажчик для посилань на всі об’єкти різних класів. Отже, ми створюємо вказівник на базовий клас, який посилається на всі похідні об’єкти. Але якщо покажчик базового класу містить адресу об’єкта похідного класу, завжди виконується функція базового класу. Цю проблему можна вирішити лише за допомогою віртуальної функції.
  • «Віртуальний» — це ключове слово, яке передує звичайному оголошенню функції.
  • Коли функція робиться віртуальною, C++ визначає, яку функцію потрібно викликати під час виконання, на основі типу об’єкта, на який вказує покажчик базового класу.

Пізнє зв'язування або динамічне зв'язування

У пізньому зв’язуванні виклик функції вирішується під час виконання. Тому компілятор визначає тип об'єкта під час виконання, а потім зв'язує виклик функції.


Правила віртуальної функції

список користувачів mysql
  • Віртуальні функції повинні бути членами якогось класу.
  • Віртуальні функції не можуть бути статичними членами.
  • Доступ до них здійснюється через покажчики об’єктів.
  • Вони можуть бути другом іншого класу.
  • Віртуальна функція має бути визначена в базовому класі, навіть якщо вона не використовується.
  • Прототипи віртуальної функції базового класу та всіх похідних класів мають бути ідентичними. Якщо дві функції з однаковою назвою, але різними прототипами, C++ вважатиме їх перевантаженими функціями.
  • Ми не можемо мати віртуальний конструктор, але можемо мати віртуальний деструктор
  • Розглянемо ситуацію, коли ми не використовуємо ключове слово virtual.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

Вихід:

 Value of x is : 5 

У наведеному вище прикладі * a є покажчиком базового класу. Вказівник може отримати доступ лише до членів базового класу, але не до членів похідного класу. Хоча C++ дозволяє базовому покажчику вказувати на будь-який об’єкт, похідний від базового класу, він не може отримати прямий доступ до членів похідного класу. Тому існує потреба у віртуальній функції, яка дозволяє базовому покажчику отримувати доступ до членів похідного класу.

Приклад віртуальної функції C++

Давайте розглянемо простий приклад віртуальної функції C++, яка використовується для виклику похідного класу в програмі.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

Вихід:

 Derived Class is invoked 

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

  • Віртуальна функція не використовується для виконання будь-яких завдань. Він служить лише заповнювачем.
  • Якщо функція не має визначення, така функція відома як ' нічого не робити ' функція.
  • ' нічого не робити ' функція відома як a чиста віртуальна функція . Чиста віртуальна функція — це функція, оголошена в базовому класі, яка не має визначення відносно базового класу.
  • Клас, що містить чисту віртуальну функцію, не може бути використаний для оголошення власних об’єктів, такі класи відомі як абстрактні базові класи.
  • Основна мета базового класу — надати ознаки похідним класам і створити базовий покажчик, який використовується для досягнення поліморфізму часу виконання.

Чисту віртуальну функцію можна визначити як:

 virtual void display() = 0; 

Давайте розглянемо простий приклад:

java volatile ключове слово
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

У наведеному вище прикладі базовий клас містить чисту віртуальну функцію. Отже, базовий клас є абстрактним базовим класом. Ми не можемо створити об'єкт базового класу.