多态(polymorphism)

字面上意思--多种形态,即同一种方法的行为随上下文而异。

维基百科:Polymorphism (computer science), the ability incomputer programming to present the same interface for differing underlyingforms (data types).

1、函数多态(function polymorphism):也即是函数重载(functionoverloading)

wKiom1QGxxDjcyKYAAHP7VCAaPA651.jpg

编译器根据参数列表的不同分别编译,生成不同的函数。即对于同一个函数名,编译器根据不同的参数列表可以生成不同的函数。

2、宏多态(macro polymorphism):

wKioL1QGxx_CU1huAAHPIstpucg661.jpg

编译时,表达式ADD(i1,i2)和ADD(s1,s2)替换成具体表达式。宏多态其实是实现简单的静态多态程序编译时,宏会被替换成具体的表达式,根据形参来标示具体操作

3、静态多态

静态多态本质上就是模板的具现化。编译器处理后,会得到run_vehicle()两个不同的函数。

wKioL1QGxy-QCU01AAJN7d1gH3c515.jpg

设计思想 对于相关的对象类型,直接实现它们各自的定义,不需要基类。只是规定各个具体类的实现中相同功能的接口名要相同。静态多态本质上就是模板的具现化,主要通过模板来实现又称编译时多态

4、动态多态:基于继承机制和虚函数

wKioL1QGx0bBtzfzAAKGD6anzCQ445.jpg

设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。动态多态基于继承机制和虚函数又称运行时多态

虚函数实现原理框图:

wKioL1QGw_uBkahWAAEuljQsC3o414.jpg

重点:虚函数

静态联编(staticbinding):在编译过程中进行联编;

动态联编(dynamic binding):有虚函数,编译器生成能够在程序运行时选择正确的虚方法的代码。

静态和动态的比较:

不同点

1、本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;

2、动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,静态多态通过模板具现在编译期完成。

相同点

1、都能够实现多态性,静态多态--编译期多态、动态多态--运行期多态;

2、都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现。