15

来自四人组关于模板方法模式:

三个实施问题值得注意:

  1. 使用 C++ 访问控制。在 C++ 中,模板方法调用的原始操作可以声明为受保护成员。这确保它们仅由模板方法调用。必须被覆盖的原始操作被声明为纯虚拟的。模板方法本身不应该被覆盖;因此,您可以使模板方法成为非虚拟成员函数。

“这确保了它们只被模板方法调用。” 不是真的,是吗?由于原始方法(例如,如果有些是虚拟的而不是纯虚拟的)也可以从派生类中调用。仅将原始方法声明为私有可确保它们仅由模板方法调用,这不是真的吗?然后,私有虚拟原始方法仍然可以在子类中实现(或重新实现)以提供在超类的模板方法中定义的算法中所需的特殊行为。

参见 Herb Sutter 的“虚拟性”:

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

他说:

准则 #2:更喜欢将虚拟函数设为私有。准则#3:只有当派生类需要调用虚函数的基实现时,才使虚函数受到保护。

我在 GoF 模板方法模式中没有看到派生类调用虚函数的基类实现的任何要求,那么为什么四人组建议将这些函数设为受保护而不是私有呢?

4

1 回答 1

11

答案很简单:

设计模式可以追溯到 1994 年。此时,C++ 仍在大力发展为我们今天所熟知的语言——之前的标准于 1998 年完成!编译器有缺陷,不支持我们现在认为理所当然的重要特性。

但更重要的是,很多东西还没有被发现(尤其是主流程序员)。以模板元编程为例,整个过程只是在同一时间“偶然发现”的。

我高度怀疑私有虚函数也是如此:GoF 根本不知道这是合法的 C++。或者,如果是的话,它还没有将自己确立为公约。

事实上,即使不考虑 C++11,大多数在 1994 年被认为“好”的 C++ 代码在今天也会被认为过于复杂和容易出错。

于 2012-03-07T13:53:50.103 回答