来自四人组关于模板方法模式:
三个实施问题值得注意:
- 使用 C++ 访问控制。在 C++ 中,模板方法调用的原始操作可以声明为受保护成员。这确保它们仅由模板方法调用。必须被覆盖的原始操作被声明为纯虚拟的。模板方法本身不应该被覆盖;因此,您可以使模板方法成为非虚拟成员函数。
“这确保了它们只被模板方法调用。” 不是真的,是吗?由于原始方法(例如,如果有些是虚拟的而不是纯虚拟的)也可以从派生类中调用。仅将原始方法声明为私有可确保它们仅由模板方法调用,这不是真的吗?然后,私有虚拟原始方法仍然可以在子类中实现(或重新实现)以提供在超类的模板方法中定义的算法中所需的特殊行为。
参见 Herb Sutter 的“虚拟性”:
http://www.gotw.ca/publications/mill18.htm
他说:
准则 #2:更喜欢将虚拟函数设为私有。准则#3:只有当派生类需要调用虚函数的基实现时,才使虚函数受到保护。
我在 GoF 模板方法模式中没有看到派生类调用虚函数的基类实现的任何要求,那么为什么四人组建议将这些函数设为受保护而不是私有呢?