多态性和虚函数讲稿.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《多态性和虚函数讲稿.ppt》由会员分享,可在线阅读,更多相关《多态性和虚函数讲稿.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于多态性和虚函数关于多态性和虚函数第一页,讲稿共三十页哦多态性多态性 不同的对象接收到相同的消息时产生多种完全不同的行不同的对象接收到相同的消息时产生多种完全不同的行为的现象称为多态性。为的现象称为多态性。C+C+支持两种多态性支持两种多态性:编译时的多态性和运行时多态编译时的多态性和运行时多态性。编译时的多态性使用重载来获得,运行时的多态性性。编译时的多态性使用重载来获得,运行时的多态性通过使用继承和虚函数获得。通过使用继承和虚函数获得。C+C+语言中,重载包括函数重载和运算符重载。语言中,重载包括函数重载和运算符重载。第二页,讲稿共三十页哦6.1 6.1 运算符重载运算符重载6.1.1
2、6.1.1 6.1.1 6.1.1 运算符重载概述运算符重载概述运算符重载概述运算符重载概述6.1.2 6.1.2 6.1.2 6.1.2 用成员函数重载运算符用成员函数重载运算符用成员函数重载运算符用成员函数重载运算符6.1.3 6.1.3 6.1.3 6.1.3 用友元函数重载运算符用友元函数重载运算符用友元函数重载运算符用友元函数重载运算符6.1.4 6.1.4 6.1.4 6.1.4 几个常用运算符的重载几个常用运算符的重载几个常用运算符的重载几个常用运算符的重载第三页,讲稿共三十页哦6.1.1 6.1.1 运算符重载概述运算符重载概述1.1.运算符重载定义运算符重载定义 C+C+中预
3、定义的运算符的操作对象只能是基本数据类型,中预定义的运算符的操作对象只能是基本数据类型,运算符重载是对运算符进行重新定义,赋予已有符号新功运算符重载是对运算符进行重新定义,赋予已有符号新功能的要求。能的要求。不能重载的运算符不能重载的运算符是:是:(1)(1)成员访问运算符成员访问运算符.(2)(2)作用域运算符作用域运算符(3)(3)条件运算符条件运算符?:?:(4)(4)成员指针运算符成员指针运算符*(5)(5)编译预处理命令的开始符号编译预处理命令的开始符号#第四页,讲稿共三十页哦2.2.运算符重载的规则运算符重载的规则 C+C+中中的的运运算算符符除除了了少少数数几几个个以以外外,几几
4、乎乎全全部部可可以以重重载载,程程序序员员不不能能定定义义新新的的运运算算符符,只只能能重重载载已已有有的的这这些些运算符。运算符。重载之后运算符的优先级和结合性都不能改变。重载之后运算符的优先级和结合性都不能改变。运运算算符符重重载载是是针针对对新新类类型型数数据据的的实实际际需需要要,对对原原有有运运算算符符进行适当的改造。进行适当的改造。3.3.运算符重载的形式运算符重载的形式 运运算算符符重重载载可可以以使使用用成成员员函函数数和和友友元元函函数数两两种种形形式式。运运算符重载的实质就是函数重载。算符重载的实质就是函数重载。第五页,讲稿共三十页哦6.1.2 6.1.2 用成员函数重载运
5、算符用成员函数重载运算符 在类定义体中声明运算符函数的形式为在类定义体中声明运算符函数的形式为:type operator type operator(参数表参数表)其中其中为为运算符符号运算符符号 若运算符是一元的,则参数表为空,此时当前对象作为此运算符的单操若运算符是一元的,则参数表为空,此时当前对象作为此运算符的单操作数;若运算符是二元的,则参数表中有一个操作数,此时当前对象作为此作数;若运算符是二元的,则参数表中有一个操作数,此时当前对象作为此运算符的左操作数,参数表中的操作数作为此运算符的右操作数。运算符的左操作数,参数表中的操作数作为此运算符的右操作数。运算符函数的定义如下:运算符
6、函数的定义如下:type type 类名类名:operator operator(参数表)参数表)/运算符处理程序代码运算符处理程序代码 重重载载运运算算符符的的使使用用方方法法同同原原运运算算符符一一样样,只只是是它它的的操操作作数数一一定定要要是是定定义义它的特定类的对象。它的特定类的对象。第六页,讲稿共三十页哦l【例【例6.16.1】用成员函数重载运算符】用成员函数重载运算符+l#includelclasspointlprivate:lfloatx,y;lpublic:lpoint(floatxx=0,floatyy=0)x=xx;y=yy;lfloatget_x()returnx;lf
7、loatget_y()returny;lpointoperator+(pointq);/重载运算符重载运算符“+”l;lpointpoint:operator+(pointq)lreturnpoint(x+q.x,y+q.y);lvoidmain()lpointp1(3,3),p2(2,2),p3;/声明声明point类的对象类的对象lp3=p1+p2;或或p1.operator+(p2)/两点相加两点相加lcoutp1+p2:x=p3.get_x(),y=p3.get_y()endl;l第七页,讲稿共三十页哦l【例【例6.6.2 2】用成员函数重载运算符用成员函数重载运算符+l#includ
8、epointpoint:operator+()lclasspointl+x;lprivate:+y;lfloatx,y;return*this;lpublic:lpoint(floatxx=0,floatyy=0)x=xx;y=yy;lfloatget_x()returnx;lfloatget_y()returny;lpointoperator+();/重载前置运算符重载前置运算符“+”l;lvoidmain()lpointp1(10,10);l+p1;或或lcoutp1:x=p1.get_x(),y=p1.get_y()endl;l第八页,讲稿共三十页哦6.1.3 6.1.3 用友元函数重载
9、运算符用友元函数重载运算符friend type operator friend type operator(参数表参数表););注意友元函数不属于任何类,它没有注意友元函数不属于任何类,它没有thisthis指针指针,这与成员,这与成员函数完全不同。若运算符是一元的,则参数表中有一个操函数完全不同。若运算符是一元的,则参数表中有一个操作数;若运算符是二元的,则参数表中有两个操作数。作数;若运算符是二元的,则参数表中有两个操作数。友友元运算符函数与成员运算符函数的主要区别在其参数个数不同元运算符函数与成员运算符函数的主要区别在其参数个数不同。友元运算符函数的定义如下:友元运算符函数的定义如下:
10、type type operator operator(参数表参数表)/运算符处理程序代码运算符处理程序代码 第九页,讲稿共三十页哦l【例【例6.6.3 3】用友员函数重载运算符用友员函数重载运算符+l#includelclasspointlprivate:lfloatx,y;lpublic:lpoint(floatxx=0,floatyy=0)x=xx;y=yy;lfloatget_x()returnx;lfloatget_y()returny;lfriendpointoperator+(pointp1,pointp2);/重载运算符重载运算符“+”l;lpointoperator+(poi
11、ntp1,pointp2)lreturnpoint(p1.x+p2.x,p1.y+p2.y);lvoidmain()lpointp1(3,3),p2(2,2),p3;/声明声明point类的对象类的对象lp3=p1+p2;或或operator+(p1,p2)/两点相加两点相加lcoutp1+p2:x=p3.get_x(),y=p3.get_y()endl;l第十页,讲稿共三十页哦6.1.4 6.1.4 几个常用运算符的重载几个常用运算符的重载2前自增和后自增运算符前自增和后自增运算符+的重载的重载前自增运算符前自增运算符+和后自增运算符和后自增运算符+重载的语法重载的语法 operator+(
12、);/operator+();/前前 operator+(operator+(intint);/);/后后课本课本P147P147【例【例6.76.7】用成员函数重载前自增和后自增运算符。】用成员函数重载前自增和后自增运算符。【例【例6.86.8】用友元重载前自增和后自增用友元重载前自增和后自增 第十一页,讲稿共三十页哦6.2 6.2 虚函数虚函数6.2.1 6.2.1 为什么要引入虚函数为什么要引入虚函数6.2.2 6.2.2 虚函数的定义与使用虚函数的定义与使用第十二页,讲稿共三十页哦6.2.1 6.2.1 为什么要引入虚函数为什么要引入虚函数 指向基类对象的指针都可以指向它的公有派生类对
13、象,但不指向基类对象的指针都可以指向它的公有派生类对象,但不能指向它的私有派生类对象。能指向它的私有派生类对象。不能将一个声明为指向派生类对象不能将一个声明为指向派生类对象的指针指向其基类的一个对象。的指针指向其基类的一个对象。声声明明为为指指向向基基类类对对象象的的指指针针,当当它它指指向向公公有有派派生生类类对对象象时时,只只能能利利用用它它来来直直接接访访问问派派生生类类中中从从基基类类继继承承来来的的成成员员,不不能能直直接接访访问问公公有派生类中特定的成员。有派生类中特定的成员。若若想想访访问问其其公公有有派派生生类类的的特特定定成成员员,可可以以将将基基类类指指针针显显式式类类型型
14、转换为派生类指针来实现。转换为派生类指针来实现。【例【例6.146.14】引入虚函数举例引入虚函数举例第十三页,讲稿共三十页哦l【例【例6.6.1414】引入虚函数举例引入虚函数举例l#includelclassbaselpublic:lvoidwho()lcoutthisistheclassofbase!endl;lclassderive1:publicbaselpublic:lvoidwho()lcoutthisistheclassofderive1!endl;lclassderive2:publicbaselpublic:lvoidwho()lcoutthisistheclassofde
15、rive2!who();lderive1obj2;p=&obj3;lderive2obj3;p-who();lp=&obj1;(derive2*)p)-who();lp-who();obj2.who();lp=&obj2;obj3.who();lp-who();第十四页,讲稿共三十页哦6.2.2 6.2.2 虚函数的定义与使用虚函数的定义与使用 1 1虚函数的定义虚函数的定义 虚虚函函数数定定义义是是在在基基类类中中进进行行的的(virtualvirtual),虚虚函函数数提提供供了了一一种种接接口口界界面面。在在基基类类中中的的某某个个成成员员函函数数被被声声明明为为虚虚函函数数后后,在在派
16、派生生类类中中重重新新定定义义虚虚函函数数时时,都都必必须须与与基基类类中中的的原原型型完完全相同全相同。虚函数是一种非静态的成员函数,说明虚函数的方法虚函数是一种非静态的成员函数,说明虚函数的方法如下:如下:virtual virtual 类型函数名(参数表)类型函数名(参数表)第十五页,讲稿共三十页哦2.2.虚函数与重载函数的关系虚函数与重载函数的关系(1)(1)重重载载函函数数要要求求函函数数有有相相同同的的函函数数名名称称,但但是是形形参参的的个个数数或或者者类类型型不不应应相相同同;而而虚虚函函数数则则要要求求函函数数名名、返返回回值值类类型和参数完全相同;型和参数完全相同;(2)(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性 函数 讲稿
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内