Подтвердить что ты не робот

Когда использовать шаблон vs inheritance

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

4b9b3361

Ответ 1

Я вижу, что шаблоны и наследование являются буквально ортогональными понятиями: Наследование является "вертикальным" и идет вниз, от абстрактного до более конкретного. Форма, треугольник, равносторонний треугольник.

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

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

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

Ответ 2

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

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

Мейерс подводит итог:

  • Оба класса и шаблоны поддерживают интерфейсы и полиморфизм.
  • Для классов интерфейсы явны и сосредоточены на функции подписи. Полиморфизм происходит во время выполнения через виртуальные функции.
  • Для параметров шаблона интерфейсы являются неявными и основаны на действительных выражения. Полиморфизм возникает во время компиляции с помощью шаблона разрешение на создание и выполнение перегрузки.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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