Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Полиморфизм и виртуальные функции

Страница 27 из 43 · 2026-10-25 · 1 мин чтения

Полиморфизм и виртуальные функции

Динамический полиморфизм

Виртуальная функция позволяет вызвать реализацию производного класса через указатель или ссылку на базовый тип.

class Shape {public:    virtual double Area() const = 0;    virtual ~Shape() = default;};class Circle : public Shape {public:    explicit Circle(double radius) : radius(radius) {}    double Area() const override { return 3.141592653589793 * radius * radius; }private:    double radius;};

= 0 делает функцию чисто виртуальной, а класс — абстрактным: напрямую создать Shape нельзя.

override

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

Виртуальный деструктор

Если объект производного класса может удаляться через указатель на базовый класс, деструктор базы должен быть виртуальным:

Shape* shape = new Circle(2.0);delete shape;

В прикладном коде предпочитай std::unique_ptr<Shape> вместо ручного new и delete, но требование виртуального деструктора при полиморфном удалении остаётся.

Пример использования

void PrintArea(const Shape& shape) {    std::cout << shape.Area() << '\n';}

Функция принимает любой конкретный класс, реализующий интерфейс Shape.

Альтернатива: variant

Если набор типов закрытый и известен заранее, std::variant вместе с std::visit иногда проще и безопаснее иерархии наследования. Выбирай решение по структуре задачи.

Итог

Виртуальные функции обеспечивают динамический выбор реализации. Применяй override, делай деструктор базового полиморфного класса виртуальным и не используй наследование без необходимости.