Вот вам непопулярное мнение: добавление ООП в C было фундаментальной ошибкой. И я могу это доказать, просто проследив историю.

1983: C with Classes

Страуструп создал C with Classes, добавив классы и наследование к C. Казалось бы, элегантное расширение. Но уже тогда появились первые трещины: как совместить процедурный подход C с объектами?

1985-1990: Множественное наследование и первые жертвы

Добавили множественное наследование. Diamond problem стала классической головной болью. Виртуальные функции, vtable, проблемы с производительностью. Для интровертов, которые хотят понимать, что происходит под капотом, это превратилось в бесконечный лабиринт.

1990-е: STL и раскол парадигм

Появилась Standard Template Library. И знаете что? Она работает совершенно по-другому, используя обобщённое программирование, а не ООП. Почему? Потому что ООП с его виртуальными функциями слишком медленный для контейнеров и алгоритмов.

Теперь в C++ два непересекающихся мира: ООП с наследованием и полиморфизмом, и шаблонное программирование с compile-time полиморфизмом.

2000-2024: Признание проблемы

Посмотрите на современные рекомендации: предпочитайте композицию наследованию, избегайте глубоких иерархий, используйте CRTP вместо виртуальных функций.

Мы тратим 40 лет, чтобы понять: ООП в том виде, в котором его добавили в C++, было ошибкой. Data-oriented design и ECS архитектуры в играх это прямое доказательство.

ООП заставляет думать об отношениях между объектами вместо трансформации данных. Это противоречит тому, как работают процессоры и память.