从广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态、重载多态、类型参数化多态、包含多态4种形式来实现。类型参数化多态和包含多态统称为一般多态性,用来系统地刻画语义上相关的一组类型。重载多态和强制多态统称为特殊多态性,用来刻画语义上无关联的类型间的关系。
包含多态是指通过子类型化,1个程序段既能处理类型T的对象,也能够处理类型T的子类型S的对象,该程序段称为多态程序段。公有继承能够实现子类型。在包含多态中,1个对象可以被看作属于不同的类,其间包含关系的存在意味着公共结构的存在。包含多态在不少语言中存在,如整数类型中的子集构成1个子类型。每一个子类型中的对象可以被用在高一级的类型中,高一级类型中的所有操作可用于下一级的对象。在C++中公有继承关系是一种包含多态,每一个类可以直接公有继承父类或多个父类,如语句class Dpublic P1,public P2{……};表示类D分别是类P1和类P2的子类型。
类型参数化多态是指当1个函数(类)统一地对若干类型参数操作时,这些类型表现出某些公共的语义特性,而该函数(类)就是用来描述该特性的。在类型参数化多态中,1个多态函数(类)必须至少带有1个类型参数,该类型参数确定函数(类)在每次执行时操作数的类型。这种函数(类)也称类属函数(类)。类型参数化多态的应用较广泛,被称为最纯的多态。
重载是指用同一个名字命名不同的函数或操作符。函数重载是C++对一般程序设计语言中操作符重载机制的扩充,它可使具有相同或相近含义的函数用相同的名字,只要其参数的个数、次序或类型不一样即可。例如:
int min(int x,int y); //求2个整数的最小数
int min(int x,int y,int z); //求3个整数的最小数
int min(int n,int a[]); //求n个整数的最小数
当用户要求增加比较2个字符串大小的功能时,只需增加:
char*min(char*,char*);
而原来如何使用这组函数的逻辑不需改变,min的功能扩充很容易,也就是说维护比较容易,同时也提高了程序的可理解性,“min”表示求最小值的函数。
强制是指将一种类型的值转换成另一种类型的值进行的语义操作,从而防止类型错误。类型转换可以是隐式的,在编译时完成,如语句D=I把整型变量转换为实型;也可以是显式的,可在动态运行时完成。
从总体上来说,一般多态性是真正的多态性;特殊多态性只是表面的多态性。因为重载只允许某一个符号有多种类型,而它所代表的值分别具有不同的、不相兼容的类型。类似地,隐式类型转换也不是真正的多态,因为在操作开始前,各值必须转换为要求的类型,而输出类型也与输入类型无关。相比之下,子类与继承却是真正的多态。类型参数化多态也是一种纯正的多态,同一对象或函数在不同的类型上下文中统一地使用而不需采用隐式类型转换、运行时检测或其它各种限制。