Полиморфизм (Polymorphism) – это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет объектам разных классов реагировать на одну и ту же операцию (или метод) разными способами. Полиморфизм позволяет упростить код и сделать его более универсальным, позволяя взаимодействовать с объектами на более абстрактном уровне.
Существует два основных типа полиморфизма: статический (компиляционный) и динамический (время выполнения).
- Статический полиморфизм (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; }
- Динамический полиморфизм (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
. Это позволяет вызывать один и тот же метод на указателе базового класса, но получать разные результаты в зависимости от типа объекта.
Полиморфизм делает код более гибким и позволяет обрабатывать разные типы объектов, используя общие интерфейсы, что упрощает проектирование и поддержку программ.