Зміст курсу
C++ ООП
C++ ООП
Чистий Віртуальний Метод
Концепція віртуальних методів є ключовою для досягнення поліморфізму, забезпечуючи гнучке та розширюване проектування програмного забезпечення. Чисті віртуальні методи розширюють цю ідею, визначаючи інтерфейси та підтримуючи динамічне зв'язування.
Синтаксис чистого віртуального методу
Чистий віртуальний метод оголошується за допомогою ключового слова virtual
і ініціалізується нулем. Це вказує, що функція не має визначення в межах class
і повинна бути перевизначена будь-яким підкласом до того, як можна буде створити об'єкти цього class
.
virtual.h
virtual void example() = 0;
Цей метод працює подібно до звичайного, за винятком того, що не має тіла, обмеженого { }
, і замість цього завершується = 0;
, що вказує на відсутність реалізації. Проте інші правила для цього методу такі ж, як і для звичайних методів.
Оголошення чистого віртуального методу робить class
, у якому він оголошений, абстрактним, тобто неможливо створити екземпляри об'єктів цього класу. Це обмеження існує, оскільки кожен метод у class
повинен бути реалізований перед створенням і використанням екземпляра, щоб запобігти помилкам і непередбачуваній поведінці. Розгляньте наведений нижче код:
Animal.h
class Animal { public: virtual void speak() = 0; };
У Animal
class
визначено чистий віртуальний метод з назвою speak()
, що унеможливлює створення об'єктів цього класу. Такий підхід є логічним, оскільки мета віртуального методу — відображати характерні звуки кожної тварини.
Завдяки оголошенню методу як віртуального, кожен підклас може реалізувати власну версію, що підкреслює індивідуальність звуку кожної тварини. Оголошення методу як чистого віртуального вказує на відсутність стандартної реалізації, акцентуючи необхідність конкретних реалізацій у похідних класах.
main.cpp
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Це також логічно. Створення екземплярів Animal
class
було б непрактичним і нелогічним, оскільки цей клас представляє абстрактне поняття, що слугує категорією для різних тварин. Для узагальненої тварини не існує конкретної поведінки, що підкреслює абстрактність цього class
і важливість створення спеціалізованих підкласів для відображення унікальних звуків кожної конкретної тварини.
main.cpp
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }
Хоча створити об'єкт типу Animal
безпосередньо неможливо, цей тип все одно можна використовувати як параметр у функції. Подібно до попереднього прикладу з кнопкою, такий підхід використовує поліморфізм для створення універсальної програми, яка може динамічно змінювати свою поведінку під час виконання.
Спробуйте передати об'єкт іншого class
у функцію та перегляньте результат. Також спробуйте створити об'єкт абстрактного class
, щоб побачити, як компілятор забороняє створення через нереалізовані чисто віртуальні методи.
Дякуємо за ваш відгук!