欢迎来到天天文库
浏览记录
ID:50082074
大小:70.50 KB
页数:28页
时间:2020-03-08
《C++程序设计教程教学课件 第13章 多态性与虚函数.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第13章多态性与虚函数13.1普通成员函数重载13.2派生类指针13.3虚函数13.4纯虚函数与抽象类多态性是面向对象程序设计的重要特征之一。所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。C++的多态性具体体现在运行和编译两个方面,在程序运行时的多态性通过继承和虚函数来体现,而在程序编译时多态性体现在函数和运算符的重载上。13.1普通成员函数重载在C++语言中,只有在声明函数原型时形式参数的个数或者对应位置的类型不同,两个或更多的函数就可以共用一个名字。这种在同一作用域中允许多个函数使用同一函数名
2、的措施被称为重载(overloading)。函数重载是C++程序获得多态性的途径之一。13.1.1函数重载的方法函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,既采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型不同。否则,将无法实现函数重载。#includeintsquare(intx){returnx*x;}doublesquare(doubley){returny*y;}mai
3、n(){cout<<”Thesquareofinteger7is”<constdoublePI=3.1415;doublelength(floatr){return2
4、*PI*r;}doublelength(floatx,floaty){return2*(x+y);}例13-2:用重载函数实现求圆和矩形的周长。voidmain(){floata,b,r;cout<<”输入圆半径:”;cin>>r;cout<<”圆周长:”<>a>>b;cout<<”矩形周长:”<5、t,char);Show(char*,float);2.基类的成员函数在派生类重载。有3种编译区分方法(1)根据参数的特征加以区分例如:Show(int,char)与Show(char*,float)不是同一函数,编译能够区分(2)使用“::”加以区分例如:A::Show()有别于B::Show()(3)根据类对象加以区分例如:Aobj.Show()调用A::Show()Bobj.Show()调用B::Show()13.1.3函数重载的注意事项在C++语言中,编译程序选择相应的重载函数版本时函数返回值类型是不起6、作用的。不能仅靠函数的返回值来区别重载函数,必须从形式参数上区别开来。例如:voidprint(inta);voidprint(inta,intb);intprint(floata[]);这三个函数是重载函数,因为C++编译程序可以从形式参数上将它们区别开来。但:intf(inta);doublef(inta);这两个函数就不是重载函数,编译程序认为这是对一个函数的重复说明,因为两个函数的形式参数个数与相应位置的类型完全相同。由typedef定义的类型别名并没有真正创建一个新的类型,所以以下程序段:typede7、fdoublemoney;doublecalculate(doubleincome);moneycalculate(moneyincome);也是错误的函数重载。同样道理,不同参数传递方式也无法区别重载函数,如:voidfunc(intvalue);voidfunc(int&value);也不能作为重载函数。在程序中不可滥用函数重载,不适当的重载会降低程序的可读性。C++语言并没有提供任何约束限制重载函数之间必须有关联,程序员可能用相同的名字定义两个互不相关的函数。实际上函数重载暗示了一种关联,不应该重载那些本8、质上有区别的函数,只有当函数实现的语义非常相近时才应使用函数重载。13.1.4函数重载的二义性函数重载的二义性(ambiguity)是指C++语言的编译程序无法在多个重载函数中选择正确的函数进行调用。函数重载的二义性主要源于C++语言的隐式类型转换与默认参数。在函数调用时,编译程序将按以下规则选择重载函数:如果函数调用的实际参数类型与一个重载函数形式参数类型完全匹配,则选择调用该重载函
5、t,char);Show(char*,float);2.基类的成员函数在派生类重载。有3种编译区分方法(1)根据参数的特征加以区分例如:Show(int,char)与Show(char*,float)不是同一函数,编译能够区分(2)使用“::”加以区分例如:A::Show()有别于B::Show()(3)根据类对象加以区分例如:Aobj.Show()调用A::Show()Bobj.Show()调用B::Show()13.1.3函数重载的注意事项在C++语言中,编译程序选择相应的重载函数版本时函数返回值类型是不起
6、作用的。不能仅靠函数的返回值来区别重载函数,必须从形式参数上区别开来。例如:voidprint(inta);voidprint(inta,intb);intprint(floata[]);这三个函数是重载函数,因为C++编译程序可以从形式参数上将它们区别开来。但:intf(inta);doublef(inta);这两个函数就不是重载函数,编译程序认为这是对一个函数的重复说明,因为两个函数的形式参数个数与相应位置的类型完全相同。由typedef定义的类型别名并没有真正创建一个新的类型,所以以下程序段:typede
7、fdoublemoney;doublecalculate(doubleincome);moneycalculate(moneyincome);也是错误的函数重载。同样道理,不同参数传递方式也无法区别重载函数,如:voidfunc(intvalue);voidfunc(int&value);也不能作为重载函数。在程序中不可滥用函数重载,不适当的重载会降低程序的可读性。C++语言并没有提供任何约束限制重载函数之间必须有关联,程序员可能用相同的名字定义两个互不相关的函数。实际上函数重载暗示了一种关联,不应该重载那些本
8、质上有区别的函数,只有当函数实现的语义非常相近时才应使用函数重载。13.1.4函数重载的二义性函数重载的二义性(ambiguity)是指C++语言的编译程序无法在多个重载函数中选择正确的函数进行调用。函数重载的二义性主要源于C++语言的隐式类型转换与默认参数。在函数调用时,编译程序将按以下规则选择重载函数:如果函数调用的实际参数类型与一个重载函数形式参数类型完全匹配,则选择调用该重载函
此文档下载收益归作者所有