虚构造函数与Prototype模式构造函数是不能虚的,而这里指的是具有这样功能的函数。如在一个类中,我们使用一个virtual成员函数clone来调用复制构造函数new X(*this)。
clone函数实际上是一种专门类型的Factory Method模式,它制造了一个适当的产品,同时允许调用代码对上下文和产品类型的精确类型保持不知情。
有两个主要的原因需要使用“克隆”:
你必须对正在处理的对象的精确类型保持“不知情”,并且不希望改变被克隆的原始对象,也不希望受原始对象改变的影响。
不过有一点是很明确的,软件设计的“不知情”模式有一些优点,尤其是在用于定制和扩展的框架结构设计中;因为有些事情,你知道的越少越好!
Factory Method模式
一个高级设计师通常要求基于一个现有对象类型来创建一个“适当”类型的对象。
一个常见的,但总是错误的方式是使用“类型编码”和switch语句。正确的方式是去考虑从每一种现有对象类型到要创建的对象类型的映射应该如何处置。
换句话说,谁最清楚现有的对象类型需要创建何种类型的对象,当然是现有对象本身。所以把创建代码放在现有对象内。
FctoryMethod模式的本质在于,基类提供一个虚函数挂钩,用于产生适当的“产品”。每一个派生类可以重写继承的虚函数,为自己产生适当的产品。实际上我们具备了使用一个未知类型的对象产生另一个未知类型的对象的能力。
使用FctoryMethod模式通常意味着一个高级设计需要基于一个对象的确切类型产生另一个“适当”的对象,这样的需要往往发生于存在多个平行或几乎平行的类层次结构的情况下。
FctoryMethod模式通常是治疗一系列运行期类型查询问题的良方。
协变返回类型
一般来说,一个重写函数与被它重写的函数必须具有相同的返回类型;协变返回机制是,如果 D 类公有继承于 B 类,
那么基类虚函数的返回类型是 B 的指针(或者 B 的引用),继承类的重写该派生类函数的返回类型可以是 D 的指针(或者 D 的引用)。
协变的优势在于,总是可以在适当程度的抽象层工作。如果我们是处理Shape,获得一个抽象的ShapeEditor;如果在处理某种具体的形状类型,比如Circle,我们就可以直接获
得CircleEditor。
协变机制使得我们可以不使用类型转换操作来“重新”提供类型信息,而这种信息是一开始就不应该丢掉的。
在ibm的online文档中,有一个很好的例子,说明了协变。
参考http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr139.htm这页最后一个例子。