Вы в основном правы, динамический полиморфизм (наследование, виртуалы) обычно является правильный выбор, когда можно разрешить изменение типа во время выполнения (например, в архитектурах плагинов). style?
Зависит от того, что такое «стандартный стиль C ++». Стандартная библиотека C ++ использует всего понемногу. STL использует шаблоны для всего, немного более старая библиотека IOStreams использует наследование и виртуальные функции, а библиотечные функции, унаследованные от C, конечно же, не используют ни то, ни другое.
В наши дни шаблоны, безусловно, являются самым популярным выбором, и я ' Должен сказать, что это самый «стандартный» подход.
Свойства классического объектно-ориентированного полиморфизма:
dynamic_cast
(и его потенциал взорвать лицо клиента ) может легко компенсировать это Свойства полиморфизма времени компиляции по шаблону:
Обратите внимание, что нет необходимости делать выбор ни по одному из них. Вы можете свободно смешивать и то и другое (и многие другие идиомы и парадигмы). Часто это приводит к очень впечатляющему (и выразительному) коду. (См., Например, такие вещи, как стирание шрифтов.) Чтобы получить представление о том, что возможно за счет умного смешения парадигм, вы можете просмотреть «Современный дизайн C ++» Александреску.
Это что-то вроде ложной оппозиции. Да, в основном наследование и виртуальные функции используются в iostreams
, которые очень старые и написаны в совершенно другом стиле, чем остальные библиотеки std
.
Но многие из самых «крутых» современных библиотек C ++, такие как boost, действительно используют полиморфизм времени выполнения, они просто используют шаблоны, чтобы сделать его более удобным в использовании.
boost :: any
и std :: tr1 :: function
(ранее также из boost) - прекрасные примеры.
Они оба являются контейнерами отдельных элементов для чего-то, чей конкретный тип неизвестен во время компиляции (это особенно очевидно с any
, потому что он имеет свой собственный тип оператора динамического приведения для извлечения значения).
С моей точки зрения, это то, в чем вы лучше всех. Если у вас больше опыта с OO, используйте OO. Если у вас больше опыта работы с дженериками, используйте дженерики.
У обеих техник есть некоторые эквивалентные шаблоны, которые означают для многих вещей, которые вы можете использовать. Стратегия EG в объектно-ориентированном дизайне против политики в универсальных шаблонах или шаблонного метода в объектно-ориентированном стиле против часто повторяющегося шаблона шаблона в универсальных шаблонах.
Если вы планируете рефакторинг производственного кода, который уже работает, но структура немного воняет. Не используйте это как предлог для игры с какой-то новой техникой проектирования, потому что через год или два, когда вы лучше поймете эту технику, вы можете пожалеть о том, как вы реорганизовали свой код. При применении техник по мере их изучения очень легко привнести новые негибкости. Цель состоит в том, чтобы улучшить дизайн существующего кода, если вы не Я владею техникой, откуда вы знаете, что улучшаете дизайн, а не строите большой фаллический символ в своем коде.
Лично я лучше разбираюсь в объектно-ориентированном стиле и склонен отдавать предпочтение этому, поскольку я знаю, что могу создать чистый дизайн, который легко понять, и большинство людей может измениться. Большинство универсального кода, как я правильно понимаю, нацелено на взаимодействие с другим универсальным кодом, например написание итератора или универсальной функции для алгоритмов.