Зміст курсу
C++ ООП
C++ ООП
Ключові Слова Virtual та Override
Ключове слово virtual
Ключове слово virtual
використовується перед оголошенням методу в class
для вирішення раніше розглянутої проблеми. Його застосовують для методів, спільних для всіх підкласів, але які потребують окремої реалізації для кожного. По суті, це виглядає як звичайне оголошення методу, за винятком того, що починається з virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Коли функцію оголошено як virtual
у суперкласі, це дозволяє перевизначити її у підкласі. Тобто підклас може надати власну реалізацію, яка буде викликатися замість початкової реалізації при виклику функції через вказівник або посилання на суперклас.
main.cpp
#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(); }
Коли використовується вказівник на об'єкт і потрібно отримати доступ до його членів через цей вказівник, застосовується оператор стрілки (->
).
Повертаючись до вирішення початкової задачі з кнопками, цей підхід дозволяє легко створити одну функцію, яка приймає в якості параметра вказівник на батьківський клас Button
. Відповідно, можна викликати цю функцію, передаючи SubmitButton
, ResetButton
або CancelButton
, і вона працюватиме як задумано.
main.cpp
#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); }
Спробуйте створити об'єкти різних підкласів і передати їх у функцію.
Ключове слово Override
Ключове слово override
використовується у підкласі для явного зазначення, що функція-член перевизначає віртуальну функцію з базового класу. Це допомагає виявити помилки під час компіляції, якщо сигнатура функції у підкласі не відповідає жодній віртуальній функції у базовому класі.
main.cpp
#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() { }
Якщо виникає помилка, наприклад, опечатка у сигнатурі функції або суперклас не містить функції, яку ви намагаєтеся перевизначити, компілятор згенерує помилку, що допоможе виявити потенційні помилки на етапі компіляції. Ця функція особливо корисна у великих командах, де відстеження змін, таких як перейменування методів, може бути складним.
Дякуємо за ваш відгук!