Хорошо известно, что классы STL нигде не используют виртуальные методы (и STL также нигде не использует наследование, и что эти два факта взаимосвязаны), и что STL не уникален в этом.
Давайте предположим, что на земле существуют другие фанаты производительности (ну, они существуют), такие фанаты производительности, которые задают себе вопрос для каждого класса: «Нужны ли мне виртуальные методы для этого класса X?»и «может ли этот класс X обойтись без каких-либо виртуалов, как классы STL, для лучшей производительности?»
Отсутствие каких-либо виртуальных методов (включая d'tor) делает полиморфизм и создание подклассов более сложным, чем с базой «virtuals»классы.Очевидно, что «не виртуальные» классы не хорошо подходят для базовых классов.
Вопрос: существует ли методика (для c ++), позволяющая программисту создать за один раз две версии одного и того же класса X, "не виртуальную" версию Xnv (для производительности) и«виртуальные» версии Xv, для подклассов?Если это не нужно, объясните, почему.
Post-note
Люди ответили "Если вам нужно создать подклассы, используйте виртуальные. Если нет, не используйте виртуальные«.
Существует проблема с этим предложением.Пара проблем.
1) нуждается в изменениях подстилки со временем.подклассы из класса X тогда не были нужны, но нужны сейчас, или наоборот.
2) Человек, который пишет базовый класс, не тот, кто пишет производный класс.Это ясно из вопроса.У людей разные стили мышления, разные суждения, разные потребности.Понятно, снова.
3) Следовательно, разные программисты, отвечая на вопрос типа «имеет ли смысл наследование от класса X?», Будут давать разные ответы.Это субъективно, точного ответа нет.
4) Это противоречит тому, что задает вопрос.
Следовательно, мы хотим удовлетворить два конца спектра - что часто случается в технике - и это мотивация вопроса.
Мотивация была слишком сложной, чтобы выразить ее кратко.Я предположил, что люди могут (1) предположить, что мотивация существует, поскольку вопрос был точно сформулирован, или могут (2) изобразить мотивацию, потому что они уже находились в подобной ситуации компромисса и баланса в дизайне c ++.
Никто не понял мотивации - к моему удивлению - возможно, даже сейчас.Это будет уроком для меня.
Я принял ответ, в котором упоминается CRTP, потому что это веселый паттерн.