C++语言程序设计中多态问题分析
2017-03-06李欣然赵山林
李欣然+赵山林
摘 要: C++语言程序设计课程中,多态性分为两类。一是静态多态,通过函数重载实现,解决自定义数据类型运算问题;二是动态多态,通过虚函数实现,提高了程序的可扩充性。通过实例分析出利用函数重载实现静态多态的方法以及利用虚函数产生动态多态的条件。
关键词: C++语言程序设计; 静态多态; 动态多态; 虚函数
中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2017)02-57-0
0 引言
多态性是面向对象程序设计的一个重要特征。从系统实现的角度看,多态性分为两類:静态多态性和动态多态性[1]。静态多态性是通过函数重载实现的。由函数重载和运算符重载形成的多态性属于静态多态性。动态多态性是指编译时不能确定调用的是哪个函数,而在程序运行过程中才动态地确定具体操作对象。动态多态又称运行时的多态性。
1 静态多态性
静态多态性是程序编译时就知道调用函数的全部信息,因此,在程序编译时系统就能决定要调用的是哪个函数。静态多态性又称编译时的多态性。静态多态性的函数调用速度快、效率高,但缺乏灵活性,在程序运行前就已决定了执行的函数和方法。下面介绍静态多态的实现方法。
1.1 函数重载
C++允许用同一函数名定义多个函数,这些函数的参数类型或者参数个数不同,这就是函数的重载。重载函数的参数个数,参数类型,或参数顺序三者中必须至少有一种不同,函数返回值类型可以相同也可以不同。下列程序的功能是利用函数重载求两个整数或三个整数最大数。
函数重载以后,根据实参的类型及个数决定调用哪个重载的函数。上例中实参是两个就调用求两个数最大值函数,同理实参是三个就调用求三个数最大值得函数。
当几个函数的功能是相同的或者相近的,只是参数类型或者参数个数不同,可以考虑定义函数重载。同一个函数,通过重载可以实现不同的功能。
1.2 运算符重载
运算符重载也属于函数重载,解决的是自定义数据类型的运算问题。运算符重载既可以重载为类的成员函数也可以重载为类的友元函数。下列程序的功能是通过运算符重载为类的成员函数完成复数的算术运算。
C++中的运算符只能对基本数据类型进行运算。复数是一种自定义数据类型,是不能用C++提供的运算符完成算术运算的。自定义数据类型--复数类只有通过运算符重载才能利用C++已有的运算符完成运算。所以,运算符重载解决的是自定义数据类型的运算问题。同理通过对流插入运算符和流提取运算符重载可以解决自定义数据类型的输入输出问题。
2 动态多态性
动态多态性是指在编译过程中不能确定调用的是哪个函数,只有在程序运行过程中才能确定调用具体函数的过程。它又称运行时的多态性。动态多态性是通过虚函数( virtual function)实现的。面向对象实现动态多态应满足三个条件。首先,动态关联必须存在于类的继承结构中,也就是说有基类有派生类。其次,基类中某一成员函数被定义为虚函数,且该虚函数在派生类中有不同的实现。第三,利用指针或引用调用该虚函数才能产生动态关联。
下列程序的功能是通过虚函数完成动态关联。
上例中p1. Area()是通过对象名调用虚函数产生静态关联,对象名调用的是自己所属类的虚函数。fun(rect)调用的是派生类的Area()函数,而fun(p1)调用的是基类的Area()函数。通过指针或引用调用虚函数才能产生动态关联。
3 结论
本文分析了《C++语言程序设计》课程中多态问题。多态分为静态多态和动态多态。通过实例分析出静态多态的特点和作用,以及静态多态的实现方法。通过实例分析出动态多态的特征,以及实现动态关联的条件。帮助读者理解面向对象程序设计语言的基本特征-----多态的含义和作用。
参考文献(Reference):
[1] 谭浩强.C++程序设计[M].清华大学出版社,2015.
[2] 郑莉.C++语言程序设计(第4版)[M].清华大学出版社,2011.
[3] 钱能.C++程序设计教程设计思想与实现[M].清华大学出版
社,2009.
[4] 姚林.C++程序设计[M].人民邮电出版社,2011.