第8章--多态性1.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)
《第8章--多态性1.ppt》由会员分享,可在线阅读,更多相关《第8章--多态性1.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第8章多态性8.1运算符重载8.2运算符重载为类的成员函数8.3运算符重载为类的友元函数8.4虚函数8.1 运算符重载8.1.1问题的提出例例6.36.3的复数类的复数类#include#include iostream.hiostream.h class class CComplexCComplex private:private:double real;double real;double double imagimag;public:public:CComplex(doubleCComplex(double r,double i);r,double i);void Print();voi
2、d Print();CComplexCComplex Add(CComplexAdd(CComplex c);c);CComplexCComplex Sub(CComplexSub(CComplex c);c);第8章 多态性CComplex CComplex:Add(CComplex c)CComplex temp;temp.real=real+c.real;temp.imag=imag+c.imag;return temp;CComplex CComplex:Sub(CComplex c)CComplex temp;temp.real=real-c.real;temp.imag=imag-
3、c.imag;return temp;8.1 运算符重载8.1.1问题的提出(续一)void void main(voidmain(void)CComplexCComplex a(1,2),b(3.0,4.0),a(1,2),b(3.0,4.0),c,dc,d;c=c=a.Add(ba.Add(b););d=d=a.Sub(ba.Sub(b););coutcout c=;c=;c.Printc.Print();();coutcout d=;d=;d.Printd.Print();();第8章 多态性复数加减法只能调用成员函数实现,复数加减法只能调用成员函数实现,不能使用符号不能使用符号“+”和
4、和“-”,可以通,可以通过重载过重载“+”、“-”运算符,实现如运算符,实现如c=a+b这样的调用方式这样的调用方式运算符重载:运算符重载的实质就是对已有的运算符赋予多重含义,使同一个运算符运算符重载:运算符重载的实质就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,产生不同的行为。运算符重载的实质就是函数重载。作用于不同类型的数据时,产生不同的行为。运算符重载的实质就是函数重载。例例8.18.1用运算符实现复数的加减运算用运算符实现复数的加减运算#includeiostream.hclassCComplexprivate:doublereal;doubleimag;pub
5、lic:CComplex(doubler=0,doublei=0);voidPrint();CComplexoperator+(CComplexc);CComplexoperator-(CComplexc);CComplex:CComplex(doubler,doublei)real=r;imag=i;第8章 多态性例例8.18.1(续一)(续一)voidCComplex:Print()cout(real,imag)endl;CComplexCComplex:operator+(CComplexc)CComplextemp;temp.real=real+c.real;temp.imag=ima
6、g+c.imag;returntemp;CComplexCComplex:operator-(CComplexc)CComplextemp;temp.real=real-c.real;temp.imag=imag-c.imag;returntemp;第8章 多态性例例8.18.1(续二)(续二)voidmain(void)CComplexa(1,2),b(3.0,4.0),c,d;c=a+b;d=a-b;coutc=;c.Print();coutd=;d.Print();第8章 多态性该语句相当于对函数该语句相当于对函数operator+(CComplex c)的调用:的调用:“c=a.ope
7、rator+(b)”,实现两个复数,实现两个复数的加法运算。的加法运算。程序运行结果为:程序运行结果为:c=(4,6)c=(4,6)d=(-2,-2)d=(-2,-2)8.1 运算符重载8.1.2运算符重载的格式与规则1.1.运算符重载的格式运算符重载的格式运算符重载的格式运算符重载的格式 运算符重载为类的成员函数运算符重载为类的成员函数 运算符重载为类的友元函数运算符重载为类的友元函数 运算符重载的为类的成员函数,在类中声明的格式为:运算符重载的为类的成员函数,在类中声明的格式为:运算符重载的为类的成员函数,在类中声明的格式为:运算符重载的为类的成员函数,在类中声明的格式为:函数类型函数类型
8、 operatoroperator运算符(参数表);运算符(参数表);定义该函数的格式:定义该函数的格式:定义该函数的格式:定义该函数的格式:函数类型函数类型 类名类名:operator:operator运算符(参数表)运算符(参数表)函数体;函数体;也可以将重载运算符函数的定义直接写在类中。也可以将重载运算符函数的定义直接写在类中。第8章 多态性8.1 运算符重载8.1.2运算符重载的格式与规则(续)2.2.运算符重载的规则运算符重载的规则运算符重载的规则运算符重载的规则(1 1)除)除“.”.”、“*”“*”、“:”:”、“?:”?:”和和“sizeofsizeof”等几个运算等几个运算符
9、不能重载外,符不能重载外,C+C+中几乎所有的运算符都可以重载。中几乎所有的运算符都可以重载。(2 2)运算符被重载后,其优先级和结合性不会改变。)运算符被重载后,其优先级和结合性不会改变。(3 3)不能改变运算符操作对象的个数。)不能改变运算符操作对象的个数。第8章 多态性 返 回8.2 运算符重载为类的成员函数8.2.1双目运算符重载双目运算符双目运算符,如果,如果重载为类的成员函数重载为类的成员函数,其,其参数为一个参数为一个,即比,即比运算对象少一个。运算对象少一个。例例8.28.2复数的乘法运算,在上例的基础上添加乘法运算符重复数的乘法运算,在上例的基础上添加乘法运算符重载函数。复数
10、类乘法运算的定义如下:载函数。复数类乘法运算的定义如下:(a+bia+bi)*(x+yix+yi)=a*=a*x-bx-b*y+(a*y+b*y+(a*y+b*x)ix)i第8章 多态性例例8.28.2复数乘法运算源程序复数乘法运算源程序#includeiostream.hclassCComplexprivate:doublereal;doubleimag;public:CComplex(doubler=0,doublei=0);voidPrint();CComplexoperator+(CComplexc);CComplexoperator-(CComplexc);CComplexopera
11、tor*(CComplexc);CComplex:CComplexCComplex:CComplex(doubler,doublei)(doubler,doublei)real=r;real=r;imagimag=i;=i;第8章 多态性例例8.28.2(续一)(续一)voidCComplex:Print()cout(real,imag)endl;CComplexCComplex:operator+(CComplexc)CComplextemp;temp.real=real+c.real;temp.imag=imag+c.imag;returntemp;CComplexCComplex:ope
12、rator-(CComplexc)CComplextemp;temp.real=real-c.real;temp.imag=imag-c.imag;returntemp;第8章 多态性例例8.28.2(续二)(续二)CComplex CComplex:operator*(CComplex c)CComplex temp;temp.real=real*c.real-imag*c.imag;temp.imag=real*c.imag+imag*c.real;return temp;void main(void)CComplex a(1,2),b(3.0,4.0),c,d,e,f;c=a+b;d=a
13、-b;e=a*b;f=a+1;cout c=;c.Print();cout d=;d.Print();cout e=;e.Print();cout f=;f.Print();第8章 多态性程序运行结果为:程序运行结果为:c=(4,6)c=(4,6)d=(-2,-2)d=(-2,-2)e=(-5,10)e=(-5,10)f=(2,2)f=(2,2)总结:总结:总结:总结:设有双目运算符设有双目运算符设有双目运算符设有双目运算符 B B,如果要重,如果要重,如果要重,如果要重载载载载 B B 为类的成员函数,使之能够实为类的成员函数,使之能够实为类的成员函数,使之能够实为类的成员函数,使之能够实现
14、表达式现表达式现表达式现表达式 oprd1 B oprd2oprd1 B oprd2,其中,其中,其中,其中 oprd1 oprd1 为为为为A A 类对象,则类对象,则类对象,则类对象,则 B B 应被重载应被重载应被重载应被重载为为为为 A A 类的成员函数,形参类型应该类的成员函数,形参类型应该类的成员函数,形参类型应该类的成员函数,形参类型应该是是是是 oprd2 oprd2 所属的类型。所属的类型。所属的类型。所属的类型。经重载后,表达式经重载后,表达式经重载后,表达式经重载后,表达式oprd1 B oprd1 B oprd2 oprd2 相当于相当于相当于相当于 oprd1.ope
15、rator oprd1.operator B(oprd2)B(oprd2),注意重载双目运算符只,注意重载双目运算符只,注意重载双目运算符只,注意重载双目运算符只需要一个参数。需要一个参数。需要一个参数。需要一个参数。8.2 运算符重载为类的成员函数8.2.2单目运算符重载单目运算符单目运算符,如果,如果重载为类的成员函数重载为类的成员函数,不需要参数不需要参数。为区分前置和后置运算符,为区分前置和后置运算符,C+C+规定:规定:对于对于前置单目运算符前置单目运算符,重载函数,重载函数没有参数没有参数对于对于后置单目运算符后置单目运算符,重载函数,重载函数有一个整型参数有一个整型参数,这个整型
16、参,这个整型参数没有其他用途,只是用于区分前置运算与后置运算。数没有其他用途,只是用于区分前置运算与后置运算。第8章 多态性例例8.38.3定义一个定义一个CIntCInt类,类中只有一个数据成员类,类中只有一个数据成员i i,两个运算,两个运算符符“+”+”的重载函数,一个没有参数,实现的是前置运算符重的重载函数,一个没有参数,实现的是前置运算符重载,另一个有一个整型参数,实现后置运算符重载。载,另一个有一个整型参数,实现后置运算符重载。#includeiostream.hclassCIntprivate:inti;public:CInt(inta=0);voidPrint();CIntop
17、erator+();CIntoperator+(int);CInt:CIntCInt:CInt(intinta)a)i=a;i=a;第8章 多态性voidCInt:Print()couti=iendl;CIntCInt:operator+()CInttemp;temp.i=+i;returntemp;CIntCInt:operator+(int)CInttemp;temp.i=i+;returntemp;例例8.38.3(续)(续)voidmain(void)CInta(5),b(5),c,d;c=a+;d=+b;couta:;a.Print();coutb:;b.Print();coutc:
18、;c.Print();coutd:;d.Print();第8章 多态性程序运行结果为:程序运行结果为:a:i=6a:i=6b:i=6b:i=6c:i=5c:i=5d:i=6d:i=68.2 运算符重载为类的成员函数8.2.3赋值运算符重载如果类中只包含简单数据类型的数据成员,则使用如果类中只包含简单数据类型的数据成员,则使用C+C+提供的提供的赋值运算符赋值运算符“=”=”就可以实现将一个对象赋给另一个对象。如前面就可以实现将一个对象赋给另一个对象。如前面复数类的对象,就可以将一个对象直接赋给另一个对象。但如果复数类的对象,就可以将一个对象直接赋给另一个对象。但如果类的数据成员比较复杂(如含有
19、指针),这样直接赋值就会产生类的数据成员比较复杂(如含有指针),这样直接赋值就会产生问题,我们必须重载赋值运算符问题,我们必须重载赋值运算符“=”=”才能正确使用才能正确使用“=”=”。第8章 多态性例例8.48.4类类A A只有一个数据成员只有一个数据成员strstr,是一个字符指针,在构造函,是一个字符指针,在构造函数中为数中为strstr申请存储空间并赋值,在析构函数中释放内存。申请存储空间并赋值,在析构函数中释放内存。#includeiostream.h#includestring.hclassAprivate:char*str;public:A(char*s=nodata);A();
20、voidprint();A:A(char*s)intlen=strlen(s);str=newcharlen+1;strcpy(str,s);第8章 多态性例例8.48.4(续)(续)A:A()if(str)deletestr;voidA:print()coutstrendl;voidmain(void)A*p=newA(AAAA);Aa1;a1=*p;a1.print();deletep;a1.print();第8章 多态性strpstra1AAAA该语句只是将该语句只是将p所指向的对象数据成员所指向的对象数据成员str赋给对象赋给对象a1的数据成员的数据成员str,即两个,即两个对象的对象
21、的str指向了同一个单元指向了同一个单元调用析构函数,同时将调用析构函数,同时将str所指向的单元释放了,所指向的单元释放了,再执行再执行a1.print()时,就会出现错误。时,就会出现错误。例例8.58.5带有重载赋值运算符的带有重载赋值运算符的A A类类#includeiostream.h#includestring.hclassAprivate:char*str;public:A(char*s=nodata);A();A&operator=(A&a);voidprint();A:A(char*s)intlen=strlen(s);str=newcharlen+1;strcpy(str,
22、s);第8章 多态性例8.5(续一)A:A()if(str)deletestr;A&A:operator=(A&a)intlen=strlen(a.str);if(str)deletestr;/先释放,再根据实际需要重新申请str=newcharlen+1;strcpy(str,a.str);return*this;voidA:print()coutstrendl;第8章 多态性例8.5(续二)voidmain(void)A*p=newA(AAAA);Aa1;a1=*p;a1.print();deletep;a1.print();第8章 多态性strpstra1AAAAAAAA程序运行结果为:
23、程序运行结果为:AAAAAAAAAAAAAAAA 返 回8.3 运算符重载为类的友元函数8.3.1问题的提出(1 1)复数与复数相加()复数与复数相加(c1c1,c2c2,c3c3是复数类的对象)。是复数类的对象)。c3=c1+c2c3=c1+c2;(2 2)一个复数与一个实数的加法运算)一个复数与一个实数的加法运算c3=c1+10.8c3=c1+10.8;(3 3)一个实数与一个复数相加就会出现错误。)一个实数与一个复数相加就会出现错误。c3=c3=10.8+c110.8+c1;因为加号左边的运算对象是实数,因为加号左边的运算对象是实数,C+C+试图将加号右边的运算试图将加号右边的运算对象解
24、释为实数,但对象解释为实数,但C+C+无法将一个复数转换为一个实数,从而产无法将一个复数转换为一个实数,从而产生错误。生错误。将运算符重载为友元函数可以解决这个问题。将运算符重载为友元函数可以解决这个问题。第8章 多态性8.3 运算符重载为类的友元函数8.3.2运算符重载为友元函数 类中的类中的声明声明:friendfriend函数类型函数类型 operatoroperator运算符(参数表);运算符(参数表);运算符重载函数的运算符重载函数的定义形式定义形式:函数类型函数类型 operatoroperator运算符(参数表)运算符(参数表)函数体;函数体;第8章 多态性例8.6用友元函数实现
25、复数类加减运算符的重载#includeiostream.hclassCComplexprivate:doublereal;doubleimag;public:CComplex(doubler=0,doublei=0);voidPrint();friendCComplexoperator+(CComplexc1,CComplexc2);friendCComplexoperator-(CComplexc1,CComplexc2);CComplex:CComplex(doubler,doublei)real=r;imag=i;第8章 多态性例8.6(续一)voidCComplex:Print()co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内