在本章中,我们回顾了一个经典的面向对象设计模式 —— 模板方法模式,并探讨了它在 C++ 程序中的应用。该模式在 C++ 中的表现与其他面向对象语言一样有效,但 C++ 还拥有其独特的变体 —— 非虚接口惯用法。这种设计模式的优势促使我们遵循一条较为通用的准则:将所有虚函数设为私有或受保护的。需要注意的是,关于析构函数在多态中的使用有其特殊性。
以下是关于虚函数访问权限(公有 vs 私有)的一般性指导原则:
优先使用非虚接口,采用模板方法设计模式。
优先将虚函数设为私有。
只有当派生类需要调用基类的虚函数实现时,才将该虚函数设为受保护(protected)。
基类的析构函数应满足以下之一:
如果通过基类指针删除对象,则应为 公有且虚函数;
如果派生对象是直接删除的,则应为 受保护且非虚函数。
本章中我们已经提到了策略模式,用以明确它与模板方法模式的区别。策略模式在 C++ 中同样非常流行,尤其是其泛型编程的等价形式。这将是下一章的主题。