【发布时间】:2012-03-25 01:10:16
【问题描述】:
来自四人组的模板方法模式:
三个实现问题值得注意:
- 使用 C++ 访问控制。在 C++ 中,模板方法调用的原始操作可以声明为受保护成员。这确保 它们仅由模板方法调用。原始操作 必须被覆盖的被声明为纯虚拟。模板方法 本身不应被覆盖;因此您可以制作模板 方法一个非虚拟成员函数。
“这确保它们只被模板方法调用。”不是真的,是吗?由于原始方法(例如,如果有些是虚拟的而不是纯虚拟的)也可以从派生类中调用。仅将原始方法声明为私有可确保它们仅由模板方法调用,这不是真的吗?然后,私有虚拟原始方法仍然可以在子类中实现(或重新实现),以提供在超类的模板方法中定义的算法中所需的特殊行为。
参见 Herb Sutter 的“虚拟”:
http://www.gotw.ca/publications/mill18.htm
他声明的地方:
准则 #2:倾向于将虚拟函数设为私有。 准则 #3:仅当派生类需要调用 虚函数,使虚函数受保护。
我在 GoF 模板方法模式中没有看到派生类调用虚函数的基类实现的任何要求,那么为什么四人组建议将这些函数设为受保护而不是私有?
【问题讨论】:
标签: c++ design-patterns virtual template-method-pattern