您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > (C++完整PPT课件) 第 8 章 多态性
第八章多态性本章主要内容多态性运算符重载虚函数纯虚函数抽象类第八章多态性多态性的概念多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。多态的实现:函数重载运算符重载虚函数第八章多态性8.1运算符重载运算符重载是使同一个运算符作用于不同类型的数据时具有不同的行为。例如,我们声明了一个点类point和它的对象pointp1(1,1),p2(3,3),并希望能使用“+”运算符实现表达式“p1+p2”,就需要重载“+”运算符。运算符重载是实质上将运算对象转化为运算函数的实参,并根据实参的类型来确定重载的运算函数。第八章多态性1.只能重载C++中已有的运算符,不能臆造新的运算符;2.类属关系运算符“.”、作用域分辨符“::”、成员指针运算符“*”、sizeof运算符和三目运算符“?:”不能重载。3.重载之后运算符的优先级和结合性都不能改变,单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。4.运算符重载后的功能应当与原有功能相类似。5.重载运算符含义必须清楚,不能有二义性。运算符的重载形式有两种:(1)重载为类的成员函数;(2)重载为类的友元函数。8.1.1运算符重载的规则第八章多态性运算符重载为类的友元函数的一般语法形式为:friend函数类型operator运算符(形参表){函数体;}其中:(1)函数类型:重载运算符的返回值类型,即运算结果类型;(2)operator:定义运算符重载函数的关键字。(3)运算符:要重载的运算符名称。(4)形参表:给出对象和类型。(5)friend:运算符重载为友元函数时的关键字。第八章多态性1.双目运算:oprd1Boprd2把B重载为oprd1所属类的成员函数,只有一个形参,形参的类型是oprd2所属类。例如,经过重载之后,表达式oprd1+oprd2就相当于函数调用oprd1.operator+(oprd2)。2.单目运算1)前置单目运算:Uoprd把U重载为oprd所属类的成员函数,没有形参。例如,“++”重载的语法形式为:函数类型operator++();++oprd就相当于函数调用oprd.operator++();8.1.2运算符重载为成员函数第八章多态性2)后置单目运算oprdV运算符V重载为oprd所属类的成员函数,带有一个整型(int)形参。例如,后置单目运算符“--”重载的语法形式为:函数类型operator--(int);oprd--就相当于函数调用oprd.operator--(0);第八章多态性//EX8_1.cpp:演示重载二维点point的“+”、“-”运算符#includeiostream.hclasspoint{private:floatx,y;public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}pointoperator+(pointp1);//重载运算符“+”pointoperator-(pointp1);//和“-”为成员函数};第八章多态性pointpoint::operator+(pointq){returnpoint(x+q.x,y+q.y);}pointpoint::operator-(pointq){returnpoint(x-q.x,y-q.y);}voidmain(){pointp1(3,3),p2(2,2),p3,p4;//声明point类的对象p3=p1+p2;//两点相加p4=p1-p2;//两点相减coutp1+p2:x=p3.get_x(),y=p3.get_y()endl;coutp1-p2:x=p4.get_x(),y=p4.get_y()endl;}第八章多态性可以看出,除了在函数声明及实现的时候使用了关键字operator之外,运算符重载成员函数与类的普通成员函数没有什么区别。在使用的时候,可以直接通过运算符、操作数的方式来完成函数调用。程序运行结果为:p1+p2:x=5,y=5p1-p2:x=1,y=1第八章多态性1.双目运算:oprd1Boprd2双目运算符B重载为oprd1所属类的友元函数,该函数有两个形参,表达式oprd1Boprd2就相当于函数调用operatorB(oprd1,oprd2)。2.单目运算1)前置单目运算Uoprd前置单目运算符U重载为oprd所属类的友元函数,表达式Uoprd相当于函数调用operatorU(oprd)。2)后置单目运算oprdV后置单目运算符V重载为oprd所属类的友元函数,表达式oprdV相当于函数调用operatorV(oprd,int)。8.1.3运算符重载为友元函数第八章多态性//EX8_2.cpp://演示使用运算符重载为友元函数的方法重做两点加减法运算#includeiostream.hclasspoint{private:floatx,y;public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}friendpointoperator+(pointp1,pointp2);//重载“+”和friendpointoperator-(pointp1,pointp2);//“-”为友元函数};第八章多态性pointoperator+(pointp1,pointp2){returnpoint(p1.x+p2.x,p1.y+p2.y);}pointoperator-(pointp1,pointp2){returnpoint(p1.x-p2.x,p1.y-p2.y);}voidmain(){pointp1(3,3),p2(2,2),p3,p4;//声明point类的对象p3=p1+p2;//两点相加p4=p1-p2;//两点相减coutp1+p2:x=p3.get_x(),y=p3.get_y()endl;coutp1-p2:x=p4.get_x(),y=p4.get_y()endl;}程序运行结果:p1+p2:x=5,y=5p1-p2:x=1,y=1第八章多态性1.比较运算符重载例如,、、=、=、==和!=。2.赋值运算符重载例如,=、+=、-=、*=和/=。这些运算符的重载比较简单。8.1.4其他运算符重载第八章多态性//EX8_3.cpp:演示比较运算符和赋值运算符重载的程序#includeiostream.hclasspoint{private:floatx,y;public:point(floatxx=0,floatyy=0){x=xx;y=yy;}point(point&);~point(){}booloperator==(point);booloperator!=(point);pointoperator+=(point);pointoperator-=(point);floatget_x(){returnx;}floatget_y(){returny;}};第八章多态性point::point(point&p){x=p.x;y=p.y;}boolpoint::operator==(pointp){if(x==p.get_x()&&y==p.get_y())return1;elsereturn0;}boolpoint::operator!=(pointp){if(x!=p.get_x()&&y!=p.get_y())return1;elsereturn0;}pointpoint::operator+=(pointp){this-x+=p.get_x();this-y+=p.get_y();return*this;}第八章多态性pointpoint::operator-=(pointp){this-x-=p.get_x();this-y-=p.get_y();return*this;}voidmain(){pointp1(1,2),p2(3,4),p3(5,6);coutp1==p2?(p1==p2)endl;coutp1!=p2?(p1!=p2)endl;p3+=p1;coutp3+=p1,p3:p3.get_x(),p3.get_y()endl;p3-=p1;coutp-=p1,p3:p3.get_x(),p3.get_y()endl;}第八章多态性程序运行结果为:p1==p2?0p1!=p2?1p3+=p1,p3:6,8p3-=p1,p3:5,6第八章多态性3.下标运算符[]重载//EX8_4.cpp:演示下标运算符[]重载例题#includeiostream.h#includestring.hclassword{private:char*str;public:word(char*s){str=newchar[strlen(s)+1];strcpy(str,s);}char&operator[](intk){return*(str+k);}voiddisp(){coutstrendl;}};第八章多态性voidmain(){char*s=china;wordw(s);w.disp();intn=strlen(s);while(n=0){w[n-1]=w[n-1]-32;n--;}w.disp();}程序运行结果为:chinaCHINA第八章多态性4.运算符new和delete重载//EX8_5.cpp:演示重载new和delete的程序。其中new通过//malloc()函数实现,new的操作数是申请内存单元的字节个数。//delete通过free()函数实现,它的操作数是一个指针,即告诉//系统释放哪里的单元。#includeiostream.h#includemalloc.hclassrect{private:intlength,width;public:rect(intl,intw){length=l;width=w;}第八章多态性void*operatornew(size_tsize)//size_tunsignedinteger{returnmalloc(size);}voidoperatordelete(void*p){free(p);}voiddisp(){coutarea:length*widthendl;}};voidmain(){rect*p;p=newrect(5,9);//调用构造函数rect(5,9)p-disp();deletep;}//程序运行结果为:area:45第八章多态性5.逗号运算符重载//EX8_6.cpp:演示重载逗号“,”和加号“+”运算符的程序#includeiostream.h#includemalloc.hclasspoint{private:intx,y;public:point(){};point(intxx,intyy){x=xx;y=yy;}第八章多态性pointoperator,(pointr){returnr;}pointoperator+(pointr){pointt;t.x=x+r.x;t.y=y+r.y;returnt;}voiddisp(){coutarea:x*yendl;}};第八章多态性voidmain(){pointp1(1,2),p2(3,4),p3(5,6);p1.disp();p2.disp();p3.disp();p1=(p1,p2+p3,p3);//返回右操作数p3的坐标p1.disp();}程序运行结果为:area:2area:12area:30area:30第八章多态性8.2虚函数多态
本文标题:(C++完整PPT课件) 第 8 章 多态性
链接地址:https://www.777doc.com/doc-3751378 .html