Из «Банды четырех» по шаблону «Шаблонный метод»:
Следует отметить три проблемы реализации:
- Использование управления доступом C ++.В C ++ примитивные операции, которые вызывает метод шаблона, могут быть объявлены защищенными членами.Это гарантирует, что они вызываются только методом шаблона.Примитивные операции, которые должны быть переопределены, объявляются чисто виртуальными.Сам метод шаблона не должен быть переопределен;поэтому вы можете сделать метод шаблона не виртуальной функцией-членом.
«Это гарантирует, что они вызываются только методом шаблона».не правда ли?Поскольку примитивные методы (если некоторые являются виртуальными, а не чисто виртуальными, например) также могут быть вызваны из производного класса.Не правда ли, что только объявление частных методов примитивов гарантирует, что они вызываются только методом шаблона?Затем частные виртуальные примитивные методы все еще могут быть реализованы (или переопределены) в подклассах, чтобы обеспечить специализированное поведение, которое требуется в алгоритме, определенном в методе шаблона в суперклассе.
См. «Виртуальность» от Херба Саттера:
http://www.gotw.ca/publications/mill18.htm
Где он заявляет, что:
Указание № 2: Предпочитать делать виртуальные функции частными.Рекомендация № 3: Только если производные классы должны вызывать базовую реализацию виртуальной функции, делайте виртуальную функцию защищенной.
Я не вижу никаких требований в шаблоне метода шаблона GoF для производных классовчтобы вызывать реализации виртуальных функций базового класса, так почему же Gang of Four рекомендует делать эти функции защищенными, а не частными?