Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Полиморфизм в ООП
Полиморфизм — это ключевое понятие объектно-ориентированного программирования, которое означает "многоформность". Это способность объектов разных типов отвечать на один и тот же запрос (вызов метода), но выполняя разные действия в соответствии с их типом. Полиморфизм позволяет писать более гибкий и переиспользуемый код.
Типы полиморфизма
В 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++.