Перейти до основного вмісту
Модуль 6 · Урок 2 із 214/18 у курсі~15 min
Модульні уроки (2/2)

Поліморфізм і віртуальні функції

Поліморфізм дозволяє обробляти об’єкти різних похідних класів через вказівник або посилання на їхній базовий клас, забезпечуючи правильну версію методу, що викликається під час виконання (пізнє зв’язування).

Віртуальні функції: virtual та override

Щоб увімкнути поліморфізм у методі, ми повинні оголосити його за допомогою ключового слова virtual в базовому класі. У похідних класах ми використовуємо специфікатор override, щоб явно вказати, що ми перевизначаємо цей метод.

C++
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++ вирішить правильний метод під час виконання:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

Абстрактні класи та чисті віртуальні функції

Чиста віртуальна функція — це віртуальна функція-член, оголошена з = 0 у кінці. Він являє собою формальний контракт: базовий клас не забезпечує реалізації, повністю делегуючи його підкласам.

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

C++
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;
    }
};

Спробуйте самі

вправи#cpp.m6.l2.e1
Спроби: 0Завантаження…

Визначте віртуальний метод makeSound() у Animal, який друкує «Some sound». Потім замініть його в класі Cat за допомогою специфікатора перевизначення, щоб надрукувати «Мяу».

Завантаження редактора…
Показати підказку

Не забудьте додати `virtual` до методу базового класу та розмістити `override` після дужок параметрів у похідному класі.

Рішення доступне після 3 спроб

вправи#cpp.m6.l2.e2
Спроби: 0Завантаження…

Оголошіть чисту віртуальну функцію print(), яка повертає void у абстрактному класі Printable. Потім створіть клас Document, який публічно успадковує Printable і реалізує метод print() для друку «Друк документа».

Завантаження редактора…
Показати підказку

Чиста віртуальна функція оголошується з підписом `virtual void print() = 0;`. Переконайтеся, що `Document` відкрито успадковує `Printable`.

Рішення доступне після 3 спроб