← Назад к вопросам
Является ли механизм Generics примером полиморфизма?
2.0 Middle🔥 141 комментариев
#Язык C++
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Generics как Пример Полиморфизма
Да, Generics (обобщённые типы) являются примером полиморфизма, но это особый тип полиморфизма, называемый параметрическим полиморфизмом или полиморфизмом параметров типа. Это один из четырёх основных видов полиморфизма в программировании.
Четыре Основных Типа Полиморфизма
1. Ad-hoc Полиморфизм (Перегрузка)
void print(int x) { std::cout << x << std::endl; }
void print(double x) { std::cout << x << std::endl; }
void print(std::string x) { std::cout << x << std::endl; }
2. Параметрический Полиморфизм (Generics/Templates) ← Искомый тип
template<typename T>
void print(T value) {
std::cout << value << std::endl;
}
3. Подтипный Полиморфизм (Наследование)
class Animal {
public:
virtual void makeSound() = 0;
};
class Dog : public Animal {
public:
void makeSound() override {
std::cout << "Woof!" << std::endl;
}
};
4. Коэрцивный Полиморфизм (Неявные Преобразования)
int x = 42;
double y = x; // Неявное преобразование
Параметрический Полиморфизм в Деталях
Шаблонные Функции
template<typename T>
T maximum(T a, T b) {
return (a > b) ? a : b;
}
int main() {
std::cout << maximum(5, 10) << std::endl; // int
std::cout << maximum(3.14, 2.71) << std::endl; // double
std::cout << maximum("apple", "banana") << std::endl; // const char*
return 0;
}
Шаблонные Классы
template<typename T>
class Container {
private:
std::vector<T> items;
public:
void add(const T& item) {
items.push_back(item);
}
void display() {
for (const T& item : items) {
std::cout << item << " ";
}
std::cout << std::endl;
}
};
int main() {
Container<int> intContainer;
intContainer.add(1);
intContainer.add(2);
intContainer.add(3);
intContainer.display(); // 1 2 3
Container<std::string> strContainer;
strContainer.add("Hello");
strContainer.add("World");
strContainer.display(); // Hello World
return 0;
}
Сложный Пример: Обобщённые Алгоритмы
template<typename T>
T findMax(const std::vector<T>& container) {
return *std::max_element(container.begin(), container.end());
}
int main() {
std::vector<int> numbers = {3, 7, 2, 9, 1};
std::vector<double> decimals = {3.5, 7.2, 2.1, 9.8};
std::cout << "Max int: " << findMax(numbers) << std::endl;
std::cout << "Max double: " << findMax(decimals) << std::endl;
return 0;
}
Разница между Параметрическим и Подтипным Полиморфизмом
| Аспект | Параметрический (Generics) | Подтипный (Наследование) |
|---|---|---|
| Механизм | Шаблоны (compile-time) | Виртуальные функции |
| Производительность | Быстрее | Медленнее |
| Гибкость | Сильная типизация | Гибкая иерархия |
| Инстанцирование | Compile-time | Runtime |
Стандартная Библиотека C++ (STL)
int main() {
std::vector<int> v;
std::set<std::string> s;
std::map<int, std::string> m;
std::sort(v.begin(), v.end()); // Работает для любого типа
return 0;
}
Обобщённая Структура Данных
template<typename T>
class Stack {
private:
struct Node {
T value;
Node* next;
Node(const T& v) : value(v), next(nullptr) {}
};
Node* top;
public:
Stack() : top(nullptr) {}
void push(const T& value) {
Node* newNode = new Node(value);
newNode->next = top;
top = newNode;
}
T pop() {
if (!top) throw std::runtime_error("Stack is empty");
T value = top->value;
Node* temp = top;
top = top->next;
delete temp;
return value;
}
};
int main() {
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
std::cout << intStack.pop() << std::endl; // 2
return 0;
}
Когда Использовать
- Контейнеры: Vector<T>, List<T>, Map<K, V>
- Алгоритмы: Sort<T>, Search<T>, Filter<T>
- Утилиты: Функции обработки, абстракции
- Требуется типизация: Проверка типов на compile-time
Преимущества
- Типобезопасность: Проверка на compile-time
- Производительность: Нет runtime overhead
- Переиспользование кода: Один код для всех типов
- Оптимизация: Компилятор оптимизирует для конкретного типа