От банды четвертого по шаблону Метод:
Следует отметить три проблемы с реализацией:
- Использование контроля доступа С++. В С++ примитивные операции, которые вызывает метод шаблона, могут быть объявлены защищенными членами. Это обеспечивает что они вызываются только методом шаблона. Примитивные операции которые должны быть переопределены, объявляются чистыми виртуальными. Метод шаблона сама по себе не должна быть переопределена; поэтому вы можете сделать шаблон метод - функция, не относящаяся к элементу.
"Это гарантирует, что они вызываются только методом шаблона." не правда, не так ли? Так как примитивные методы (если некоторые из них являются виртуальными, а не виртуальными, например, например), также могут быть вызваны из производного класса. Не правда ли, что только объявление примитивных методов private гарантирует, что они вызываются только методом шаблона? Частные виртуальные примитивные методы могут затем быть реализованы (или переопределены) в подклассах, чтобы обеспечить специализированное поведение, которое требуется в алгоритме, определенном в методе шаблона в суперклассе.
См. "Виртуальность" от Herb Sutter:
http://www.gotw.ca/publications/mill18.htm
Где он утверждает, что:
Руководство № 2: Предпочтение делать виртуальные функции частными. Руководство № 3: Только если производным классам необходимо вызвать базовую реализацию виртуальную функцию, защитите виртуальную функцию.
Я не вижу никаких требований в шаблоне метода шаблона GoF для производных классов для вызова реализаций виртуальных функций базового класса, так почему же банда из четырех рекомендует защищать эти функции, а не частные?