多态是一种能够令单一泛型标记关联不同特定行为的能力,对面向对象程序设计而言多态是一块基石。C++中通过继承和虚函数实现在运行期处理这种行为的能力,我们称为动多态。然而模板也允许我们使用这种单一泛型标记来关联不同的特定行为,这种关联是在编译期间进行处理的,我们称之为静多态。
一、概念
动多态:使用继承、虚函数,基类指针实现透明地处理不同类型集合的方法(运行时多态)
静多态:使用模板参数对不同类型集合实现透明地处理的方法(编译时期多态)
二、动多态:通过继承实现的多态是绑定和动态的。
绑定的含义是:对于参与多态行为的类型,他们(具有多态行为)的接口是在公共基类的设计中就预先确定了的(有时候也把这个绑定的概念称为入侵式或者插入式的)
动态的含义是:接口在运行期动态的被绑定
三、静多态:通过模板实现的多态是非绑定的和静态的
非绑定的含义是:对于参与多态行为的类型,他们是相互独立的,没有必要用基类将他们联系起来,也没有必要在基类中事先预定公共接口,只要在这个集合中大家约定好接口的名称就好了。(有的时候也称这个概念为非入侵式或者非插入式)
静态的含义是:接口在编译时期完成绑定。
【编者感悟】什么是入侵式什么是非入侵式?如果现在我们需要增加一个新的多态类型的接口,动多态就需要在基类中提供这一接口的声明(如果是纯函数,那么其子类也需要跟着一起修改添加声明和定义)甚至是定义,这就需要“入侵”到基类,修改基类的公共接口规范!如果是静多态,那我们就可以画出一个子集,只是在需要这一新的公共接口的类型的集合中添加这一接口的声明或者定义,而不必修改到其他未参与的