(37.1)多态性之多态性的概念

1.多态性的概念

  • 派生一个类的原因并非总是为了继承或添加新成员, 有时是为了重新定义基类的成员, 使基类成员“获得新生” 。
  • 面向对象程序设计的真正力量不仅仅是继承, 而是允许派生类对象像基类对象一样处理, 其核心机制就是多态和动态联编。
  • 多态是指同样的消息被不同类型的对象接收时导致不同的行为。
    所谓消息是指对类成员函数的调用, 不同的行为是指不同的实现, 也就是调用了不同的函数。
    (1)从广义上说, 多态性是指一段程序能够处理多种类型对象的能力。
    (2)在C++中, 这种多态性可以通过重载多态(函数和运算符重载) 、强制多态(类型强制转换) 、 类型参数化多态(模板) 、 包含多态(继承及虚函数) 四种形式来实现。

2.重载多态

  • 重载是多态性的最简单形式, 分为函数重载(通过函数的参数区分)和运算符重载。
  • 重定义已有的函数称为函数重载。 在C++中既允许重载一般函数,也允许重载类的成员函数。 如对构造函数进行重载定义, 可使程序有几种不同的途径对类对象进行初始化。
  • C++允许为类重定义已有运算符的语义, 使系统预定义的运算符可操作于类对象。 如流插入(<<) 运算符和流提取(>>) 运算符(原先语义是位移运算) 。

3.强制多态

  • 强制多态也称类型转换。
  • 如C++定义了基本数据类型之间的转换规则, 即:
char→short→int→unsigned→long→unsigned
longfloat→double→long double。
  • 同时, 可以在表达式中使用3种强制类型转换表达式:
①static_cast<T>(E); 
②T(E); 
③(T)E, 
其中E代表运算表达式, T代表一个类型表达式。 
上述任意一种都可改变编译器所使用的规则,以便按自己的意愿进行所需的类型强制。

E代表运算对象
T表示要转换成的类型
  • 但是强制多态使类型检查复杂化, 尤其在允许重载的情况下, 导致无法消解的二义性。

4.类型参数化多态

  • 参数化多态即: 将类型作为函数或类的参数, 避免了为各种不同的数据类型编写不同的函数或类, 减轻了设计者负担, 提高了程序设计的灵活性。
  • 模板是C++实现参数化多态性的工具, 分为函数模板和类模板。
    类模板中的成员函数均为函数模板, 因此函数模板是为类模板服务的。

5.包含多态

  • C++中采用虚函数实现包含多态。
    虚函数为C++提供了更为灵活的多态机制, 这种多态性在程序运行时才能确定, 因此虚函数是多态性的精华, 至少含有一个虚函数的类称为多态类。 包含多态在面向对象程序设计中使用十分频繁。
  • 派生类继承基类的所有操作, 或者说, 基类的操作能被用于操作派生类的对象。
    当基类的操作不能适应派生类时, 派生类就需要重载基类的操作。
发布了556 篇原创文章 · 获赞 140 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/104161551