多态性和虚函数.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、关于多态性和虚函数关于多态性和虚函数现在学习的是第1页,共30页多态性多态性 不同的对象接收到相同的消息时产生多种完全不不同的对象接收到相同的消息时产生多种完全不同的行为的现象称为多态性。同的行为的现象称为多态性。 C+C+支持两种多态性支持两种多态性: :编译时的多态性和运行时多态性。编译时的多态性和运行时多态性。编译时的多态性使用重载来获得,运行时的多态性通过使编译时的多态性使用重载来获得,运行时的多态性通过使用继承和虚函数获得。用继承和虚函数获得。 C+ C+语言中,重载包括函数重载和运算符重载。语言中,重载包括函数重载和运算符重载。现在学习的是第2页,共30页6.1 6.1 运算符重载
2、运算符重载现在学习的是第3页,共30页1. 1. 运算符重载定义运算符重载定义 C+ C+中预定义的运算符的操作对象只能是基本数据类型,中预定义的运算符的操作对象只能是基本数据类型,运算符重载是对运算符进行重新定义,赋予已有符号新功运算符重载是对运算符进行重新定义,赋予已有符号新功能的要求。能的要求。不能重载的运算符不能重载的运算符是:是:(1) (1) 成员访问运算符成员访问运算符. .(2) (2) 作用域运算符作用域运算符(3) (3) 条件运算符条件运算符?:?:(4) (4) 成员指针运算符成员指针运算符* *(5) (5) 编译预处理命令的开始符号编译预处理命令的开始符号# #现在
3、学习的是第4页,共30页 C+C+中的运算符除了少数几个以外,几乎全部可以重载,中的运算符除了少数几个以外,几乎全部可以重载,程序员不能定义新的运算符,只能重载已有的这些运算符。程序员不能定义新的运算符,只能重载已有的这些运算符。 重载之后运算符的优先级和结合性都不能改变。重载之后运算符的优先级和结合性都不能改变。 运算符重载是针对新类型数据的实际需要,对原有运算运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。符进行适当的改造。 运算符重载可以使用成员函数和友元函数两种形式。运算符重载可以使用成员函数和友元函数两种形式。运运算符重载的实质就是函数重载。算符重载的实质就是函数重
4、载。现在学习的是第5页,共30页 在类定义体中声明运算符函数的形式为在类定义体中声明运算符函数的形式为: : type operator type operator ( (参数表参数表) ) 其中其中为为运算符符号运算符符号 若运算符是一元的,则参数表为空,此时当前对象作为此运算若运算符是一元的,则参数表为空,此时当前对象作为此运算符的单操作数;若运算符是二元的,则参数表中有一个操作数,此符的单操作数;若运算符是二元的,则参数表中有一个操作数,此时当前对象作为此运算符的左操作数,参数表中的操作数作为此运时当前对象作为此运算符的左操作数,参数表中的操作数作为此运算符的右操作数。算符的右操作数。
5、运算符函数的定义如下:运算符函数的定义如下:type type 类名类名:operator operator (参数表)参数表) / / 运算符处理程序代码运算符处理程序代码 重载运算符的使用方法同原运算符一样,只是它的操作数一定要是定义重载运算符的使用方法同原运算符一样,只是它的操作数一定要是定义它的特定类的对象。它的特定类的对象。现在学习的是第6页,共30页l【例【例6.16.1】用成员函数重载运算符】用成员函数重载运算符+ +l#includelclass pointl private:l float x,y;l public:l point(float xx=0, float yy=0
6、)x=xx; y=yy;l float get_x()return x;l float get_y()return y;l point operator +(point q);/重载运算符重载运算符“+”l ;lpoint point:operator +(point q)l return point(x+q.x, y+q.y); lvoid main()l point p1(3,3), p2(2,2), p3;/声明声明point类的对象类的对象l p3=p1+p2;或或p1. operator +(p2)/两点相加两点相加l coutp1+p2:x=p3.get_x(),y=p3.get_
7、y()endl;l现在学习的是第7页,共30页l【例【例6.6.2 2】用成员函数重载运算符用成员函数重载运算符+l#include point point:operator +()lclass point l +x;l private: +y;lfloat x,y; return *this;l public: lpoint(float xx=0,float yy=0)x=xx;y=yy;lfloat get_x()return x;lfloat get_y()return y;l point operator +(); /重载前置运算符重载前置运算符“+”l;lvoid main()l p
8、oint p1(10,10);l +p1;或或l coutp1:x=p1.get_x(),y=p1.get_y()endl;l现在学习的是第8页,共30页6.1.3 6.1.3 用友元函数重载运算符用友元函数重载运算符friend type operator friend type operator ( (参数表参数表););注意友元函数不属于任何类,它没有注意友元函数不属于任何类,它没有thisthis指针指针,这与成,这与成员函数完全不同。若运算符是一元的,则参数表中有一员函数完全不同。若运算符是一元的,则参数表中有一个操作数;若运算符是二元的,则参数表中有两个操作个操作数;若运算符是二元
9、的,则参数表中有两个操作数。数。友元运算符函数与成员运算符函数的主要区别在其参数友元运算符函数与成员运算符函数的主要区别在其参数个数不同个数不同。友元运算符函数的定义如下:友元运算符函数的定义如下:type type operator operator ( (参数表参数表) ) / / 运算符处理程序代码运算符处理程序代码 现在学习的是第9页,共30页l【例【例6.6.3 3】用友员函数重载运算符用友员函数重载运算符+ +l#includelclass pointl private:l float x,y;l public:l point(float xx=0, float yy=0)x=xx
10、; y=yy;l float get_x()return x;l float get_y()return y;l friend point operator +(point p1, point p2);/重载运算符重载运算符“+”l ;lpoint operator +(point p1, point p2)l return point(p1.x+p2.x, p1.y+p2.y); lvoid main()l point p1(3,3), p2(2,2), p3;/声明声明point类的对象类的对象l p3=p1+p2;或或operator +(p1,p2)/两点相加两点相加l coutp1+
11、p2:x=p3.get_x(),y=p3.get_y()endl;l现在学习的是第10页,共30页2前自增和后自增运算符前自增和后自增运算符+的重载的重载前自增运算符前自增运算符+和后自增运算符和后自增运算符+重载的语法重载的语法 operator+(); /operator+(); /前前 operator+(operator+(intint); /); /后后课本课本P147P147【例【例6.76.7】用成员函数重载前自增和后自增运算符。】用成员函数重载前自增和后自增运算符。【例【例6.86.8】用友元重载前自增和后自增用友元重载前自增和后自增 现在学习的是第11页,共30页6.2 6.
12、2 虚函数虚函数现在学习的是第12页,共30页 指向基类对象的指针都可以指向它的公有派生类对象,但不能指向指向基类对象的指针都可以指向它的公有派生类对象,但不能指向它的私有派生类对象。它的私有派生类对象。不能将一个声明为指向派生类对象的指针指向其不能将一个声明为指向派生类对象的指针指向其基类的一个对象。基类的一个对象。 声明为指向基类对象的指针,当它指向公有派生类对象时,只能利声明为指向基类对象的指针,当它指向公有派生类对象时,只能利用它来直接访问派生类中从基类继承来的成员,不能直接访问公有派生类用它来直接访问派生类中从基类继承来的成员,不能直接访问公有派生类中特定的成员。中特定的成员。 若想
13、访问其公有派生类的特定成员,可以将基类指针显式类型若想访问其公有派生类的特定成员,可以将基类指针显式类型转换为派生类指针来实现。转换为派生类指针来实现。 【例【例6.146.14】引入虚函数举例引入虚函数举例现在学习的是第13页,共30页l【例【例6.6.1414】引入虚函数举例引入虚函数举例l#include lclass basel public:lvoid who()lcoutthis is the class of base!endl; ;lclass derive1:public basel public:lvoid who()lcoutthis is the class of de
14、rive1!endl; ;lclass derive2:public basel public:lvoid who()lcoutthis is the class of derive2!who(); l derive1 obj2; p=&obj3; l derive2 obj3; p-who(); l p=&obj1; (derive2 *)p)-who(); l p-who(); obj2.who(); l p=&obj2; obj3.who(); l p-who(); 现在学习的是第14页,共30页6.2.2 6.2.2 虚函数的定义与使用虚函数的定义与使用 1 1虚函数的定义虚函数的定义
15、 虚函数定义是在基类中进行的(虚函数定义是在基类中进行的(virtualvirtual), ,虚函数提虚函数提供了一种接口界面。供了一种接口界面。在基类中的某个成员函数被声明为虚在基类中的某个成员函数被声明为虚函数后,在派生类中重新定义虚函数时,都必须与基类中的函数后,在派生类中重新定义虚函数时,都必须与基类中的原型完全相同原型完全相同。 虚函数是一种非静态的成员函数,说明虚函数的方法如虚函数是一种非静态的成员函数,说明虚函数的方法如下:下: virtual virtual 类型函数名(参数表)类型函数名(参数表)现在学习的是第15页,共30页2. 2. 虚函数与重载函数的关系虚函数与重载函数
16、的关系(1) (1) 重载函数要求函数有相同的函数名称,但是形参的个数或重载函数要求函数有相同的函数名称,但是形参的个数或者类型不应相同;而虚函数则要求函数名、返回值类型和参数者类型不应相同;而虚函数则要求函数名、返回值类型和参数完全相同;完全相同;(2) (2) 重载函数可以是成员函数或友员函数,而虚函数只能是成重载函数可以是成员函数或友员函数,而虚函数只能是成员函数;员函数;(3) (3) 重载函数的调用是以所传递参数序列的差别作为调用重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性 函数
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内