Ключевое

Полиморфизм в C++ позволяет объектам разных классов обрабатывать вызовы одноименных методов по-разному. Основные виды полиморфизма: времени компиляции (перегрузка функций и операторов) и времени выполнения (виртуальные функции).

  • Виртуальные функции обеспечивают динамический полиморфизм через механизм виртуальных таблиц (vtable).
  • Перегрузка функций и операторов предоставляет способ реализации статического полиморфизма.

Виды полиморфизма:

  1. Полиморфизм времени компиляции (статический):

    • Перегрузка функций: Создание нескольких функций с одинаковым именем, но разными параметрами.
    • Перегрузка операторов: Определение пользовательских версий стандартных операторов.
    // Перегрузка функций
    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);
        }
    };
  2. Полиморфизм времени выполнения (динамический):

    • Виртуальные функции: Позволяют производным классам переопределять методы базового класса для реализации специфичного поведения.
    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;
    }