Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Чистий Віртуальний Метод | Огляд Поліморфізму
C++ ООП
course content

Зміст курсу

C++ ООП

C++ ООП

1. Основи ООП у C++
2. Конструктори та Деструктори
3. Огляд Інкапсуляції
4. Огляд Наслідування
5. Огляд Поліморфізму

book
Чистий Віртуальний Метод

Концепція віртуальних методів є ключовою для досягнення поліморфізму, забезпечуючи гнучке та розширюване проектування програмного забезпечення. Чисті віртуальні методи розширюють цю ідею, визначаючи інтерфейси та підтримуючи динамічне зв'язування.

Синтаксис чистого віртуального методу

Чистий віртуальний метод оголошується за допомогою ключового слова virtual і ініціалізується нулем. Це вказує, що функція не має визначення в межах class і повинна бути перевизначена будь-яким підкласом до того, як можна буде створити об'єкти цього class.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Цей метод працює подібно до звичайного, за винятком того, що не має тіла, обмеженого { }, і замість цього завершується = 0;, що вказує на відсутність реалізації. Проте інші правила для цього методу такі ж, як і для звичайних методів.

Оголошення чистого віртуального методу робить class, у якому він оголошений, абстрактним, тобто неможливо створити екземпляри об'єктів цього класу. Це обмеження існує, оскільки кожен метод у class повинен бути реалізований перед створенням і використанням екземпляра, щоб запобігти помилкам і непередбачуваній поведінці. Розгляньте наведений нижче код:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

У Animal class визначено чистий віртуальний метод з назвою speak(), що унеможливлює створення об'єктів цього класу. Такий підхід є логічним, оскільки мета віртуального методу — відображати характерні звуки кожної тварини.

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

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Це також логічно. Створення екземплярів Animal class було б непрактичним і нелогічним, оскільки цей клас представляє абстрактне поняття, що слугує категорією для різних тварин. Для узагальненої тварини не існує конкретної поведінки, що підкреслює абстрактність цього class і важливість створення спеціалізованих підкласів для відображення унікальних звуків кожної конкретної тварини.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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 безпосередньо неможливо, цей тип все одно можна використовувати як параметр у функції. Подібно до попереднього прикладу з кнопкою, такий підхід використовує поліморфізм для створення універсальної програми, яка може динамічно змінювати свою поведінку під час виконання.

Note
Примітка

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

question mark

Що відбувається, коли клас містить чисто віртуальний метод?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 5. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

course content

Зміст курсу

C++ ООП

C++ ООП

1. Основи ООП у C++
2. Конструктори та Деструктори
3. Огляд Інкапсуляції
4. Огляд Наслідування
5. Огляд Поліморфізму

book
Чистий Віртуальний Метод

Концепція віртуальних методів є ключовою для досягнення поліморфізму, забезпечуючи гнучке та розширюване проектування програмного забезпечення. Чисті віртуальні методи розширюють цю ідею, визначаючи інтерфейси та підтримуючи динамічне зв'язування.

Синтаксис чистого віртуального методу

Чистий віртуальний метод оголошується за допомогою ключового слова virtual і ініціалізується нулем. Це вказує, що функція не має визначення в межах class і повинна бути перевизначена будь-яким підкласом до того, як можна буде створити об'єкти цього class.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Цей метод працює подібно до звичайного, за винятком того, що не має тіла, обмеженого { }, і замість цього завершується = 0;, що вказує на відсутність реалізації. Проте інші правила для цього методу такі ж, як і для звичайних методів.

Оголошення чистого віртуального методу робить class, у якому він оголошений, абстрактним, тобто неможливо створити екземпляри об'єктів цього класу. Це обмеження існує, оскільки кожен метод у class повинен бути реалізований перед створенням і використанням екземпляра, щоб запобігти помилкам і непередбачуваній поведінці. Розгляньте наведений нижче код:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

У Animal class визначено чистий віртуальний метод з назвою speak(), що унеможливлює створення об'єктів цього класу. Такий підхід є логічним, оскільки мета віртуального методу — відображати характерні звуки кожної тварини.

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

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Це також логічно. Створення екземплярів Animal class було б непрактичним і нелогічним, оскільки цей клас представляє абстрактне поняття, що слугує категорією для різних тварин. Для узагальненої тварини не існує конкретної поведінки, що підкреслює абстрактність цього class і важливість створення спеціалізованих підкласів для відображення унікальних звуків кожної конкретної тварини.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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 безпосередньо неможливо, цей тип все одно можна використовувати як параметр у функції. Подібно до попереднього прикладу з кнопкою, такий підхід використовує поліморфізм для створення універсальної програми, яка може динамічно змінювати свою поведінку під час виконання.

Note
Примітка

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

question mark

Що відбувається, коли клас містить чисто віртуальний метод?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 5. Розділ 3
some-alt