1.多态性的概念
- 派生一个类的原因并非总是为了继承或添加新成员, 有时是为了重新定义基类的成员, 使基类成员“获得新生” 。
- 面向对象程序设计的真正力量不仅仅是继承, 而是允许派生类对象像基类对象一样处理, 其核心机制就是多态和动态联编。
- 多态是指同样的消息被不同类型的对象接收时导致不同的行为。
所谓消息是指对类成员函数的调用, 不同的行为是指不同的实现, 也就是调用了不同的函数。
(1)从广义上说, 多态性是指一段程序能够处理多种类型对象的能力。
(2)在C++中, 这种多态性可以通过重载多态(函数和运算符重载) 、强制多态(类型强制转换) 、 类型参数化多态(模板) 、 包含多态(继承及虚函数) 四种形式来实现。
2.重载多态
- 重载是多态性的最简单形式, 分为函数重载(通过函数的参数区分)和运算符重载。
- 重定义已有的函数称为函数重载。 在C++中既允许重载一般函数,也允许重载类的成员函数。 如对构造函数进行重载定义, 可使程序有几种不同的途径对类对象进行初始化。
- C++允许为类重定义已有运算符的语义, 使系统预定义的运算符可操作于类对象。 如流插入(<<) 运算符和流提取(>>) 运算符(原先语义是位移运算) 。
3.强制多态
- 强制多态也称类型转换。
- 如C++定义了基本数据类型之间的转换规则, 即:
char→short→int→unsigned→long→unsigned
long→float→double→long double。
- 同时, 可以在表达式中使用3种强制类型转换表达式:
①static_cast<T>(E);
②T(E);
③(T)E,
其中E代表运算表达式, T代表一个类型表达式。
上述任意一种都可改变编译器所使用的规则,以便按自己的意愿进行所需的类型强制。
E代表运算对象
T表示要转换成的类型
- 但是强制多态使类型检查复杂化, 尤其在允许重载的情况下, 导致无法消解的二义性。
4.类型参数化多态
- 参数化多态即: 将类型作为函数或类的参数, 避免了为各种不同的数据类型编写不同的函数或类, 减轻了设计者负担, 提高了程序设计的灵活性。
- 模板是C++实现参数化多态性的工具, 分为函数模板和类模板。
类模板中的成员函数均为函数模板, 因此函数模板是为类模板服务的。
5.包含多态
- C++中采用虚函数实现包含多态。
虚函数为C++提供了更为灵活的多态机制, 这种多态性在程序运行时才能确定, 因此虚函数是多态性的精华, 至少含有一个虚函数的类称为多态类。 包含多态在面向对象程序设计中使用十分频繁。
- 派生类继承基类的所有操作, 或者说, 基类的操作能被用于操作派生类的对象。
当基类的操作不能适应派生类时, 派生类就需要重载基类的操作。