Почему GoF советует использовать защищенные (, а не приватные)виртуальные методы в реализации шаблона шаблонного метода C++?

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

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

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

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

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

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

, где он утверждает, что:

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

Я не вижу никаких требований в рамках шаблона GoF Template Method, чтобы производные классы вызывали реализации виртуальных функций базового класса, так почему же «Банда четырех» рекомендует делать эти функции защищенными, а не закрытыми?

15
задан Nawaz 7 March 2012 в 17:00
поделиться