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

Существует два основных типа полиморфизма: статический (компиляционный) и динамический (время выполнения).

  1. Статический полиморфизм (Compile-Time Polymorphism): Этот вид полиморфизма происходит на этапе компиляции программы. Статический полиморфизм основан на перегрузке функций (функции с одинаковыми именами, но разными параметрами) и перегрузке операторов. В зависимости от переданных аргументов компилятор выбирает правильную версию функции или оператора.

Пример статического полиморфизма:

cpp

class Calculator { public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } }; int main() { Calculator calc; int sum1 = calc.add(1, 2); // Вызов первой версии функции add double sum2 = calc.add(1.5, 2.5); // Вызов второй версии функции add return 0; }

  1. Динамический полиморфизм (Run-Time Polymorphism): Этот вид полиморфизма происходит во время выполнения программы. Он основан на использовании виртуальных функций (виртуальных методов) и позднем связывании (late binding). Виртуальная функция определена в базовом классе и переопределена в производных классах. Во время выполнения программа выбирает правильную версию функции в зависимости от типа объекта.

Пример динамического полиморфизма на языке C++:

cpp

class Animal { public: virtual void speak() { cout << "Животное издает звук" << endl; } }; class Dog : public Animal { public: void speak() override { cout << "Собака говорит 'Гав!'" << endl; } }; class Cat : public Animal { public: void speak() override { cout << "Кошка говорит 'Мяу!'" << endl; } }; int main() { Animal* animalPtr; Dog dog; Cat cat; animalPtr = &dog; animalPtr->speak(); // Выводит "Собака говорит 'Гав!'" animalPtr = &cat; animalPtr->speak(); // Выводит "Кошка говорит 'Мяу!'" return 0; }

В данном примере метод speak является виртуальным в базовом классе Animal и переопределен в производных классах Dog и Cat. Это позволяет вызывать один и тот же метод на указателе базового класса, но получать разные результаты в зависимости от типа объекта.

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