Уроки модуля (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, который печатает «Некоторый звук». Затем переопределите его в классе Cat, используя спецификатор переопределения, чтобы напечатать «Meow».
Показать подсказку
Не забудьте добавить слово «virtual» к методу базового класса и поместить слово «override» после круглых скобок параметра в производном классе.
Решение доступно после 3 попыток
Объявите чистую виртуальную функцию print(), возвращающую void в абстрактном классе Printable. Затем создайте класс Document, который публично наследуется от Printable и реализует метод print() для печати «Документа для печати».
Показать подсказку
Чисто виртуальная функция объявляется с подписью `virtual void print() = 0;`. Убедитесь, что «Document» публично наследуется от «Printable».
Решение доступно после 3 попыток