Почему GoF рекомендует использовать защищенные (в отличие от частных) виртуальные методы в реализации шаблона метода C ++ Template? - PullRequest
15 голосов
/ 07 марта 2012

Из «Банды четырех» по шаблону «Шаблонный метод»:

Следует отметить три проблемы реализации:

  1. Использование управления доступом C ++.В C ++ примитивные операции, которые вызывает метод шаблона, могут быть объявлены защищенными членами.Это гарантирует, что они вызываются только методом шаблона.Примитивные операции, которые должны быть переопределены, объявляются чисто виртуальными.Сам метод шаблона не должен быть переопределен;поэтому вы можете сделать метод шаблона не виртуальной функцией-членом.

«Это гарантирует, что они вызываются только методом шаблона».не правда ли?Поскольку примитивные методы (если некоторые являются виртуальными, а не чисто виртуальными, например) также могут быть вызваны из производного класса.Не правда ли, что только объявление частных методов примитивов гарантирует, что они вызываются только методом шаблона?Затем частные виртуальные примитивные методы все еще могут быть реализованы (или переопределены) в подклассах, чтобы обеспечить специализированное поведение, которое требуется в алгоритме, определенном в методе шаблона в суперклассе.

См. «Виртуальность» от Херба Саттера:

http://www.gotw.ca/publications/mill18.htm

Где он заявляет, что:

Указание № 2: Предпочитать делать виртуальные функции частными.Рекомендация № 3: Только если производные классы должны вызывать базовую реализацию виртуальной функции, делайте виртуальную функцию защищенной.

Я не вижу никаких требований в шаблоне метода шаблона GoF для производных классовчтобы вызывать реализации виртуальных функций базового класса, так почему же Gang of Four рекомендует делать эти функции защищенными, а не частными?

1 Ответ

11 голосов
/ 07 марта 2012

Ответ довольно прост:

Шаблоны проектирования датируются 1994 .В то время C ++ все еще активно развивался в язык, который мы знаем сегодня - предыдущий стандарт был завершен в 1998 году!Компиляторы были с ошибками и не поддерживали важные функции, которые мы сейчас принимаем как должное.

Но, что более важно, многие вещи еще не были обнаружены (в частности, обычными программистами).Возьмите шаблонное метапрограммирование, все из которых только «наткнулись» на в одно и то же время .

Я очень подозреваю, что то же самое верно для частных виртуальных функций: GoF просто не былЗнаю, что это был законный C ++.Или, если бы это было так, он не зарекомендовал себя как соглашение.

Фактически, большинство кода C ++, который в 1994 году считался «хорошим», считалось бы слишком сложным и подверженным ошибкам, даже без использования C++ 11 в счет.

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