Модульні уроки (2/2)
Поліморфізм і віртуальні функції
Поліморфізм дозволяє обробляти об’єкти різних похідних класів через вказівник або посилання на їхній базовий клас, забезпечуючи правильну версію методу, що викликається під час виконання (пізнє зв’язування).
Віртуальні функції: virtual та override
Щоб увімкнути поліморфізм у методі, ми повинні оголосити його за допомогою ключового слова virtual в базовому класі. У похідних класах ми використовуємо специфікатор override, щоб явно вказати, що ми перевизначаємо цей метод.
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};Використовуючи покажчики на базовий клас, C++ вирішить правильний метод під час виконання:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;Абстрактні класи та чисті віртуальні функції
Чиста віртуальна функція — це віртуальна функція-член, оголошена з = 0 у кінці. Він являє собою формальний контракт: базовий клас не забезпечує реалізації, повністю делегуючи його підкласам.
Клас, що містить принаймні одну чисту віртуальну функцію, називається абстрактним класом і не може бути створений безпосередньо.
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};Спробуйте самі
Визначте віртуальний метод makeSound() у Animal, який друкує «Some sound». Потім замініть його в класі Cat за допомогою специфікатора перевизначення, щоб надрукувати «Мяу».
Показати підказку
Не забудьте додати `virtual` до методу базового класу та розмістити `override` після дужок параметрів у похідному класі.
Рішення доступне після 3 спроб
Оголошіть чисту віртуальну функцію print(), яка повертає void у абстрактному класі Printable. Потім створіть клас Document, який публічно успадковує Printable і реалізує метод print() для друку «Друк документа».
Показати підказку
Чиста віртуальна функція оголошується з підписом `virtual void print() = 0;`. Переконайтеся, що `Document` відкрито успадковує `Printable`.
Рішення доступне після 3 спроб