Является ли механизм Generics примером полиморфизма?

«Является ли механизм Generics примером полиморфизма?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в контексте C++ шаблоны (templates), которые являются аналогом generics, реализуют форму полиморфизма, называемую параметрическим полиморфизмом (или полиморфизмом во время компиляции).

Ключевые отличия от runtime-полиморфизма (через виртуальные функции):

Аспект Параметрический (шаблоны) Подтипный (виртуальные функции)
Время разрешения Время компиляции. Время выполнения.
Механизм Инстанцирование шаблона для конкретного типа. Динамическая диспетчеризация через vtable.
Связывание Статическое, приводит к потенциально дублируемому коду. Динамическое, один общий код для иерархии.
Требования к типам Неявные (duck typing) — тип должен поддерживать все используемые операции. Явные — тип должен наследоваться от базового класса.

Пример шаблонного (параметрического) полиморфизма:

template <typename T>
T square(const T& value) { // Одна обобщенная реализация
    return value * value;   // Работает для любого типа с оператором *
}

int main() {
    std::cout << square(5);      // Инстанцируется square<int>
    std::cout << square(2.5);    // Инстанцируется square<double>
    // Компилятор генерирует две разные специализации функции.
}

Таким образом, шаблоны позволяют писать обобщенные алгоритмы и структуры данных, которые адаптируются к разным типам на этапе компиляции, что является мощной формой полиморфизма.