Когда использовать шаблон против наследования - PullRequest
32 голосов
/ 01 сентября 2011

Я искал это, и общий ответ на это, похоже, звучит так: «они не связаны, и одно не может заменить другое».Но, скажем, вы на собеседовании и вас спросят: «Когда бы вы использовали шаблон вместо наследования и наоборот?»

Ответы [ 5 ]

61 голосов
/ 01 сентября 2011

На мой взгляд, шаблоны и наследование - это буквально ортогональные понятия: наследование является «вертикальным» и идет вниз от абстрактного к более конкретному. Форма, треугольник, равносторонний треугольник.

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

Наследование обеспечивает абстракцию во время выполнения. Шаблоны генерация кода инструменты.

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

19 голосов
/ 01 сентября 2011

«Общий ответ» неверен. В «Эффективном C ++» Скотт Мейерс говорит в пункте 41:

Элемент 41: Понимать неявные интерфейсы и полиморфизм времени компиляции.

Мейерс продолжает обобщать:

  • И классы, и шаблоны поддерживают интерфейсы и полиморфизм.
  • Для классов интерфейсы являются явными и сосредоточены на функции подписи. Полиморфизм возникает во время выполнения через виртуальные функции.
  • Для параметров шаблона интерфейсы неявные и основаны на действительных выражения. Полиморфизм возникает во время компиляции через шаблон разрешение экземпляров и перегрузок функций.
3 голосов
/ 01 сентября 2011

используйте шаблон в базе (или композиции), если вы хотите сохранить безопасность типов или хотите избежать виртуальной отправки.

1 голос
/ 01 сентября 2011

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

В случае наследования все параметры должны быть определенного типа или расширяться от него. Поэтому, когда методы работают с объектами, которые правильно имеют прямые иерархические отношения, наследование является лучшим выбором.

Если наследование применено неправильно , тогда требуется создание слишком сложных иерархий классов несвязанных объектов. Сложность кода увеличится за небольшой выигрыш. Если это так, используйте шаблоны.

0 голосов
/ 07 апреля 2017

Шаблон описывает алгоритм, например, решает результат сравнения двух объектов класса или сортирует их.Тип (класс) объектов, с которыми работают, различается, но операция, логика или шаг и т. Д. Логически одинаковы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...