多态(polymorphism)
字面上意思--多种形态,即同一种方法的行为随上下文而异。
维基百科:Polymorphism (computer science), the ability incomputer programming to present the same interface for differing underlyingforms (data types).
1、函数多态(function polymorphism):也即是函数重载(functionoverloading)
编译器根据参数列表的不同分别编译,生成不同的函数。即对于同一个函数名,编译器根据不同的参数列表可以生成不同的函数。
2、宏多态(macro polymorphism):
编译时,表达式ADD(i1,i2)和ADD(s1,s2)替换成具体表达式。宏多态其实是实现简单的静态多态程序编译时,宏会被替换成具体的表达式,根据形参来标示具体操作
3、静态多态:
静态多态本质上就是模板的具现化。编译器处理后,会得到run_vehicle()两个不同的函数。
设计思想: 对于相关的对象类型,直接实现它们各自的定义,不需要基类。只是规定各个具体类的实现中相同功能的接口名要相同。静态多态本质上就是模板的具现化,主要通过模板来实现又称编译时多态
4、动态多态:基于继承机制和虚函数
设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。动态多态基于继承机制和虚函数又称运行时多态
虚函数实现原理框图:
重点:虚函数
静态联编(staticbinding):在编译过程中进行联编;
动态联编(dynamic binding):有虚函数,编译器生成能够在程序运行时选择正确的虚方法的代码。
静态和动态的比较:
不同点:
1、本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;
2、动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,静态多态通过模板具现在编译期完成。
相同点:
1、都能够实现多态性,静态多态--编译期多态、动态多态--运行期多态;
2、都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现。