1
 软件工程
1.8.2.5 6.2.5 多态性和动态绑定

6.2.5 多态性和动态绑定

多态性(Polymorphism)是指相同的操作或函数、过程作用于不同的对象上并获得不同的结果。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接收消息的对象自行决定,于是同一消息即可调用不同的方法。

多态的实现受到继承的支持,利用类的继承的层次关系,把具有通用功能的消息存放在高层次,而不同的实现这一功能的行为放在较低层次,在这些低层次上生成的对象能够给通用消息以不同的响应。

例如,在父类“几何图形”中定义了一个方法“绘图”,但是并不确定执行时绘制一个什么具体形状。子类“椭圆”和“多边形”都继承了“几何图形”的“绘图”方法,但是功能却不相同。

多态有几种布控的形式,Cardelli和Wegner把它分为四类:参数多态、包含多态、过载多态、强制多态。其中,参数多态和包含多态称为通用多态,过载多态和强制多态称为特定多态。包含多态在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另一个类型的子类型。过载多态是同一个变量被用于表示不同的功能而通过上、下文以决定一个名字所代表的功能。

动态绑定(Dynamic Binding)是在运行时根据对象接收的消息动态地确定要连接的服务代码。动态绑定是与类的继承和多态相联系的。在继承关系中,子类是父类的一个特例,所以父类对象可以出现的地方,子类对象也可以出现。因此在运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。使用虚函数可实现动态联编,不同联编可以选择不同的实现,这便是多态性。继承是动态联编的基础,虚函数是动态联编的关键。

实现多态性的基本步骤(以C++程序为例)如下:

(1)在基类中,定义成员函数为虚函数(Virtual);

(2)定义基类的公有(Public)派生类;

(3)在基类的公有派生类中“重载”该虚函数;

(4)定义指向基类的指针变量,它指向基类的公有派生类的对象。

注意:重载虚函数不是一般的重载函数,它要求函数名、返回类型、参数个数、参数类型和顺序完全相同。

程序举例:

img69

img70

img71

img72

img73

运行结果:

img74