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

Автор: Laura McKinney
Дата Створення: 2 Квітень 2021
Дата Оновлення: 13 Травень 2024
Anonim
Как работает eSIM в Украине?
Відеоролик: Как работает eSIM в Украине?

Зміст


Віртуальна функція та чиста віртуальна функція - це поняття поліморфізму часу виконання. Основна різниця між "віртуальна функція " і "Чиста віртуальна функція" полягає в тому, що "віртуальна функція" має своє визначення в базовому класі, а також успадковувані похідні класи переосмислюють її. Чиста віртуальна функція не має визначення в базовому класі, і всі спадкові похідні класи повинні її переосмислити.

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

Поліморфізм підтримується обома мовами C ++ та Java. У Java термін "переосмислення" використовується замість "віртуальна функція", оскільки віртуальна функція - термін C ++.

  1. Порівняльна діаграма
  2. Визначення
  3. Ключові відмінності
  4. Висновок

Порівняльна діаграма

Основа для порівнянняВіртуальна функціяЧиста віртуальна функція
ОсновніВіртуальна функція має своє визначення в базовому класі.Чиста віртуальна функція не має визначення в базовому класі.
Деклараціявіртуальне ім'я_функції (параметр_спису) {. . . . .};віртуальне funct_name (параметр_ список) = 0;
Отриманий класУсі похідні класи можуть або не можуть змінювати віртуальну функцію базового класу.Усі похідні класи повинні перекривати віртуальну функцію базового класу.
Ефект

Віртуальні функції носять ієрархічний характер; це не впливає на компіляцію, якщо будь-які похідні класи не перекривають віртуальну функцію базового класу.Якщо всі похідні класи не зможуть замінити віртуальну функцію базового класу, відбудеться помилка компіляції.
Анотація класуНемає концепції.Якщо клас містить хоча б одну чисту віртуальну функцію, то він оголошується абстрактним.


Визначення віртуальної функції

The віртуальна функція - це член-член базового класу, і він переосмислюється похідними класами, які успадковують базовий клас. Не обов'язково, щоб усі спадкові похідні класи повинні переосмислити віртуальну функцію, вона переосмислюється лише тими похідними класами, які можуть зажадати її функціонування. Віртуальна функція створюється шляхом оголошення функції в базовому класі, що передує ключовому слову "Віртуальний".

Декларація:

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

Спадкові похідні класи можуть перевизначити віртуальну функцію без будь-якого "віртуального" ключового слова. Отримані класи переосмислюють віртуальну функцію для виконання її завдання. Оскільки віртуальна функція переосмислюється у похідних класах, у нас є кілька форм однієї функції. Тепер, яка версія функції викликається, залежить від того, який тип об'єкта буде посилатися, щоб викликати цю функцію.


Багаторівневе успадкування

У багаторівневому успадкуванні, де похідний клас, який успадкував віртуальну функцію від свого базового класу, коли сам використовується як базовий клас для іншого похідного класу, віртуальну функцію все-таки можна перекрити. Отже, коли віртуальна функція успадковується, її віртуальна природа також успадковується.

Віртуальні функції також є ієрархічними за своєю природою, тобто якщо похідний клас не переосмислює / не визначає віртуальну функцію, успадковану від базового класу, і коли об'єкт похідного класу викликає цю віртуальну функцію, тоді виртуальна функція, визначена базовим класом, викликається.

Визначення чистої віртуальної функції

Як видно вище, якщо похідний клас не перекриває віртуальну функцію, тоді використовується віртуальна функція, визначена базовим класом. Але що робити, якщо сам базовий клас не визначає віртуальну функцію. Багато разів базовий клас не має визначення віртуальної функції, або іноді потрібно, що всі похідні класи повинні перекривати віртуальну функцію.

Щоб вирішити ці вищезгадані дві ситуації, C ++ підтримує концепцію "Чиста віртуальна функція". "Чиста віртуальна функція" оголошена в базовому класі, але не має її визначення в базовому класі. Чиста віртуальна функція оголошується наступним чином.

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

Щоразу, коли віртуальна функція в базовому класі робиться «чистою», тоді кожен похідний клас повинен обов'язково перекривати чисту віртуальну функцію базового класу. Якщо похідний клас не зможе змінити чисту віртуальну функцію базового класу, це призведе до помилки компіляції.

Анотація класу

Клас, що містить хоча б одну чисту функцію, називається "абстрактним класом". Не можна створювати об'єкти абстрактних класів, але ви можете створювати посилання та покажчики на абстрактні класи. Доступ до членів абстрактних класів можна отримати через об'єкт похідних класів, який успадковує абстрактний базовий клас.

Клас, який потрібно оголосити абстрактним, використовуйте ключове слово "Абстрактно" перед "Клас" ключове слово.

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

  1. Віртуальні функції, безумовно, визначені в базовому класі та перероблені (переопределені) у похідному класі. З іншого боку, чиста віртуальна функція базового класу особливо не визначена в базовому класі
  2. Отриманий клас, якщо потрібно переосмислити (замінити) віртуальну функцію, тоді як у випадку чистої віртуальної функції похідний клас повинен обов'язково переглядати чисту віртуальну функцію.
  3. Якщо похідному класу не вдається переосмислити (замінити) віртуальну функцію, він може використовувати віртуальну функцію базового класу. І навпаки, якщо похідному класу не вдається перекрити чисту віртуальну функцію, то виникає помилка компіляції.
  4. Базовий клас, що містить віртуальну функцію, може бути ініційований, тобто його об'єкт може бути створений. На відміну від базового класу, що містить чисту віртуальну функцію, тобто абстрактний клас не може бути ініційований, оскільки абстрактний клас не визначений повністю.

Примітка:
Прототип "віртуальної функції" та "чистої віртуальної функції" залишається однаковим у всій програмі.

Висновок:

І "віртуальні функції", і "чисті віртуальні функції" мають важливе значення, як і у "віртуальних функціях", усі похідні класи не потребують перевизначення віртуальної функції, і там, де ми хочемо, щоб усі похідні класи переосмислили віртуальну функцію, чисту віртуальну Функція найкраще застосовується там.