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

Зміст курсу

C++ ООП

C++ ООП

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

book
Ключові Слова Virtual та Override

Ключове слово virtual

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

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Коли функцію оголошено як virtual у суперкласі, це дозволяє перевизначити її у підкласі. Тобто підклас може надати власну реалізацію, яка буде викликатися замість початкової реалізації при виклику функції через вказівник або посилання на суперклас.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Примітка

Коли використовується вказівник на об'єкт і потрібно отримати доступ до його членів через цей вказівник, застосовується оператор стрілки (->).

Повертаючись до вирішення початкової задачі з кнопками, цей підхід дозволяє легко створити одну функцію, яка приймає в якості параметра вказівник на батьківський клас Button. Відповідно, можна викликати цю функцію, передаючи SubmitButton, ResetButton або CancelButton, і вона працюватиме як задумано.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Примітка

Спробуйте створити об'єкти різних підкласів і передати їх у функцію.

Ключове слово Override

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

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

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

question mark

Яке основне призначення ключового слова virtual?

Select the correct answer

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

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

course content

Зміст курсу

C++ ООП

C++ ООП

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

book
Ключові Слова Virtual та Override

Ключове слово virtual

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

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Коли функцію оголошено як virtual у суперкласі, це дозволяє перевизначити її у підкласі. Тобто підклас може надати власну реалізацію, яка буде викликатися замість початкової реалізації при виклику функції через вказівник або посилання на суперклас.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Примітка

Коли використовується вказівник на об'єкт і потрібно отримати доступ до його членів через цей вказівник, застосовується оператор стрілки (->).

Повертаючись до вирішення початкової задачі з кнопками, цей підхід дозволяє легко створити одну функцію, яка приймає в якості параметра вказівник на батьківський клас Button. Відповідно, можна викликати цю функцію, передаючи SubmitButton, ResetButton або CancelButton, і вона працюватиме як задумано.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Примітка

Спробуйте створити об'єкти різних підкласів і передати їх у функцію.

Ключове слово Override

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

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

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

question mark

Яке основне призначення ключового слова virtual?

Select the correct answer

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

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

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

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