Ключевое
Полиморфизм в C++ позволяет объектам разных классов обрабатывать вызовы одноименных методов по-разному. Основные виды полиморфизма: времени компиляции (перегрузка функций и операторов) и времени выполнения (виртуальные функции).
- Виртуальные функции обеспечивают динамический полиморфизм через механизм виртуальных таблиц (vtable).
- Перегрузка функций и операторов предоставляет способ реализации статического полиморфизма.
Виды полиморфизма:
-
Полиморфизм времени компиляции (статический):
- Перегрузка функций: Создание нескольких функций с одинаковым именем, но разными параметрами.
- Перегрузка операторов: Определение пользовательских версий стандартных операторов.
// Перегрузка функций void print(int i) { std::cout << "Integer: " << i << std::endl; } void print(double d) { std::cout << "Double: " << d << std::endl; } // Перегрузка операторов class Complex { public: double real, imag; Complex(double r, double i) : real(r), imag(i) {} // Перегрузка оператора + Complex operator+(const Complex& other) { return Complex(real + other.real, imag + other.imag); } };
-
Полиморфизм времени выполнения (динамический):
- Виртуальные функции: Позволяют производным классам переопределять методы базового класса для реализации специфичного поведения.
class Animal { public: virtual void makeSound() { std::cout << "Some generic animal sound" << std::endl; } }; class Dog : public Animal { public: void makeSound() override { std::cout << "Bark" << std::endl; } }; class Cat : public Animal { public: void makeSound() override { std::cout << "Meow" << std::endl; } }; // Пример использования void makeAnimalSound(Animal& animal) { animal.makeSound(); } int main() { Dog dog; Cat cat; makeAnimalSound(dog); // Выведет "Bark" makeAnimalSound(cat); // Выведет "Meow" return 0; }