← Назад к вопросам

Что такое полиморфизм в ООП?

1.3 Junior🔥 251 комментариев
#ООП и проектирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Полиморфизм в ООП

Полиморфизм — это ключевое понятие объектно-ориентированного программирования, которое означает "многоформность". Это способность объектов разных типов отвечать на один и тот же запрос (вызов метода), но выполняя разные действия в соответствии с их типом. Полиморфизм позволяет писать более гибкий и переиспользуемый код.

Типы полиморфизма

В C++ существует два основных вида полиморфизма:

1. Статический полиморфизм (compile-time)

Перегрузка функций — одна из форм статического полиморфизма, когда несколько функций имеют одно имя, но разные параметры:

void print(int x) { std::cout << "Int: " << x << std::endl; }
void print(double x) { std::cout << "Double: " << x << std::endl; }
void print(const std::string& x) { std::cout << "String: " << x << std::endl; }

print(42);           // Вызовет print(int)
print(3.14);         // Вызовет print(double)
print("Hello");      // Вызовет print(string)

Шаблоны (templates) — ещё один способ достичь статического полиморфизма:

template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int maxInt = max(10, 20);           // T = int
double maxDouble = max(3.14, 2.71); // T = double

2. Динамический полиморфизм (runtime)

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

class Animal {
public:
    virtual void speak() const {
        std::cout << "Some sound" << std::endl;
    }
    virtual ~Animal() = default; // Виртуальный деструктор
};

class Dog : public Animal {
public:
    void speak() const override {
        std::cout << "Woof!" << std::endl;
    }
};

class Cat : public Animal {
public:
    void speak() const override {
        std::cout << "Meow!" << std::endl;
    }
};

void printSound(const Animal& animal) {
    animal.speak(); // Вызовет нужную speak() в зависимости от типа
}

Dog dog;
Cat cat;
Animal* animal1 = &dog;
Animal* animal2 = &cat;

printSound(dog);  // Выведет: Woof!
printSound(cat);  // Выведет: Meow!

Ключевые концепции

Базовый класс — определяет интерфейс, который будут реализовывать подклассы.

Переопределение методов — подклассы могут переопределить виртуальные методы базового класса.

Указатели и ссылки — полиморфизм работает через указатели и ссылки на базовый класс, указывающие на объекты подклассов.

Практический пример

#include <iostream>
#include <vector>
#include <memory>

class Shape {
public:
    virtual double area() const = 0;  // Чистая виртуальная функция
    virtual ~Shape() = default;
};

class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    double area() const override { return width * height; }
};

class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    double area() const override { return 3.14159 * radius * radius; }
};

int main() {
    std::vector<std::shared_ptr<Shape>> shapes;
    shapes.push_back(std::make_shared<Rectangle>(5, 4));
    shapes.push_back(std::make_shared<Circle>(3));
    
    for (const auto& shape : shapes) {
        std::cout << "Area: " << shape->area() << std::endl;
    }
    
    return 0;
}

Преимущества полиморфизма

  • Гибкость: код работает с базовым классом, но может обрабатывать любые подклассы
  • Расширяемость: легко добавить новые подклассы без изменения существующего кода
  • Переиспользуемость: один алгоритм может работать с разными типами данных
  • Чистота кода: избегаем множества условных операторов (if-else)

Полиморфизм — это фундамент проектирования гибких и масштабируемых систем в C++.

Что такое полиморфизм в ООП? | PrepBro