




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现。重载函数是多态性的一种简单形式。虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编。,第9章虚函数与多态性,9.1静态联编,9.2类指针的关系,9.3虚函数与动态联编,9.4纯虚函数与抽象类,9.5虚函数和多态性的应用,小结,第9章虚函数与多态性,联编是指一个程序模块、代码之间互相关联的过程。静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。重载函数使用静态联编。动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。switch语句和if语句是动态联编的例子。,9.1静态联编,9.1静态联编,普通成员函数重载可表达为两种形式:,1.在一个类说明中重载,例如:voidShow(int,char);voidShow(char*,float);,9.1静态联编,普通成员函数重载可表达为两种形式:,1.在一个类说明中重载,例如:voidShow(int,char);与voidShow(char*,float);不是同一函数,编译能够区分,2.基类的成员函数在派生类重载。有3种编译区分方法:,(1)根据参数的特征加以区分,9.1静态联编,普通成员函数重载可表达为两种形式:,1.在一个类说明中重载,2.基类的成员函数在派生类重载。有3种编译区分方法:,(1)根据参数的特征加以区分,例如:A:Show();有别于B:Show();,(2)使用“:”加以区分,9.1静态联编,普通成员函数重载可表达为两种形式:,1.在一个类说明中重载,2.基类的成员函数在派生类重载。有3种编译区分方法:,(1)根据参数的特征加以区分,(2)使用“:”加以区分,例如:Aobj.Show()调用A:Show()Bobj.Show()调用B:Show(),(3)根据类对象加以区分,根据this指针类型区分,基类指针和派生类指针与基类对象和派生类对象4种可能匹配:直接用基类指针引用基类对象;直接用派生类指针引用派生类对象;用基类指针引用一个派生类对象;用派生类指针引用一个基类对象。,9.2类指针的关系,9.2类指针的关系,例如:A*p;/指向类型A的对象的指针AA_obj;/类型A的对象BB_obj;/类型B的对象p=/p指向类型B的对象,它是A的派生类,利用p,可以通过B_obj访问所有从A类继承的元素,但不能用p访问B类自定义的元素(除非用了显式类型转换),9.2.1基类指针引用派生类对象,9.2.1基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,例9-1使用基类指针引用派生类对象,9.2.1基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,基类指针,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,基类指针指向基类对象,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,基类指针调用基类成员函数,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,基类指针指向派生类对象,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,调用从基类继承的成员函数,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,用派生类对象调用派生类的成员函数,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,对基类指针强类型转换调用派生类的成员函数,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,#include#includeusingnamespacestd;classA_classcharname20;public:voidput_name(char*s)strcpy_s(name,s);voidshow_name()coutput_name(Wangxiaohua);A_p-show_name();A_p=,9.2.1基类指针引用派生类对象,例9-1使用基类指针引用派生类对象,派生类指针只有经过强制类型转换之后,才能引用基类对象,9.2.2派生类指针引用基类对象,9.2.2派生类指针引用基类对象,#includeusingnamespacestd;classDatepublic:Date(inty,intm,intd)SetDate(y,m,d);voidSetDate(inty,intm,intd)year=y;month=m;day=d;voidPrint()coutPrint();couthours:minutes:secondsn;private:inthours,minutes,seconds;intmain()DateTimedt(2009,1,1,12,30,0);dt.Print();,例9-2日期时间程序。在派生类中调用基类同名成员函数,9.2.2派生类指针引用基类对象,#include#includeclassDatepublic:Date(inty,intm,intd)SetDate(y,m,d);voidSetDate(inty,intm,intd)year=y;month=m;day=d;voidPrint()coutPrint();couthours:minutes:secondsPrint();,对this指针作类型转换调用基类成员函数,9.2.2派生类指针引用基类对象,例9-2日期时间程序。在派生类中调用基类同名成员函数,#includeusingnamespacestd;classDatepublic:Date(inty,intm,intd)SetDate(y,m,d);voidSetDate(inty,intm,intd)year=y;month=m;day=d;voidPrint()coutPrint();couthours:minutes:secondsPrint();,9.2.2派生类指针引用基类对象,例9-2日期时间程序。在派生类中调用基类同名成员函数,对this指针作类型转换调用基类成员函数,#includeusingnamespacestd;classDatepublic:Date(inty,intm,intd)SetDate(y,m,d);voidSetDate(inty,intm,intd)year=y;month=m;day=d;voidPrint()coutPrint();couthours:minutes:secondsn;private:inthours,minutes,seconds;intmain()DateTimedt(2009,1,1,12,30,0);dt.Print();,9.2.2派生类指针引用基类对象,例9-2日期时间程序。在派生类中调用基类同名成员函数,Date:Print();,等价吗?为什么?,冠以关键字virtual的成员函数称为虚函数实现运行时多态的关键首先是要说明虚函数,另外,必须用基类指针调用派生类的不同实现版本,9.3虚函数和动态联编,基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员,9.3.1虚函数和基类指针,9.3.1虚函数和基类指针,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,例9-3演示基类指针的移动,9.3.1虚函数和基类指针,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,p,定义基类指针,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,p,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,voidwho()coutFirstderivedclass:x,yn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,voidwho()coutFirstderivedclass:x,yn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,通过对象调用成员函数,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,voidwho()coutSecondderivedclass:x,y,zn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,voidwho()coutSecondderivedclass:x,y,zn;,基类指针做类型转换,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,通过基类指针只能访问从基类继承的成员,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;voidwho()coutwho();p=,修改程序定义虚函数,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,基类定义虚函数,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,派生类的重定义版本默认为虚函数,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,p,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,p,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,voidwho()coutFirstderivedclass:x,yn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,voidwho()coutFirstderivedclass:x,yn;,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,voidwho()coutSecondderivedclass:x,y,zn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,voidwho()coutSecondderivedclass:x,y,zn;,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,#includeusingnamespacestd;classBasepublic:Base(charxx)x=xx;virtualvoidwho()coutwho();p=,由于who()的虚特性随着p指向不同对象,this指针作类型转换执行不同实现版本,9.3.1虚函数和基类指针,例9-3演示基类指针的移动,注意:一个虚函数,在派生类层界面相同的重载函数都保持虚特性虚函数必须是类的成员函数不能将友元说明为虚函数,但虚函数可以是另一个类的友元析构函数可以是虚函数,但构造函数不能是虚函数,9.3.1虚函数和基类指针,9.3.1虚函数和基类指针,在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同如果仅仅返回类型不同,C+认为是错误重载如果函数原型不同,仅函数名相同,丢失虚特性,9.3.2虚函数的重载特性,9.3.2虚函数的重载特性,例:classbasepublic:virtualvoidvf1();virtualvoidvf2();virtualvoidvf3();voidf();,voidg()derivedd;base*bp=,classderived:publicbasepublic:voidvf1();/虚函数voidvf2(int);/重载,参数不同,虚特性丢失charvf3();/error,仅返回类型不同voidf();/非虚函数重载;,9.3.2虚函数的重载特性,9.3.2虚函数的重载特性,构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象,9.3.3虚析构函数,9.3.3虚析构函数,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,例9-4普通析构函数在删除动态派生类对象的调用情况,9.3.3虚析构函数,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,用基类指针建立派生类的动态对象,9.3.3虚析构函数,例9-4普通析构函数在删除动态派生类对象的调用情况,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,用派生类指针建立派生类的动态对象,9.3.3虚析构函数,例9-4普通析构函数在删除动态派生类对象的调用情况,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,析构由基类指针建立的派生类对象没有调用派生类析构函数,9.3.3虚析构函数,例9-4普通析构函数在删除动态派生类对象的调用情况,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,析构由派生类指针建立的派生类对象正确调用派生类析构函数,9.3.3虚析构函数,例9-4普通析构函数在删除动态派生类对象的调用情况,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,例9-5虚析构函数在删除动态派生类对象的调用情况,virtualA()coutA:A()iscalled.n;,9.3.3虚析构函数,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,例9-5虚析构函数在删除动态派生类对象的调用情况,9.3.3虚析构函数,virtualA()coutA:A()iscalled.n;,正确调用派生类构造函数释放所有资源,#includeusingnamespacestd;classApublic:A()coutA:A()iscalled.n;classB:publicApublic:B()coutB:B()iscalled.n;intmain()A*Ap=newB;B*Bp2=newB;coutdeletefirstobject:n;deleteAp;coutdeletesecondobject:n;deleteBp2;,例9-5虚析构函数在删除动态派生类对象的调用情况,9.3.3虚析构函数,virtualA()coutA:A()iscalled.n;,定义了基类虚析构函数,基类指针指向的派生类动态对象也可以正确地用delete析构设计类层次结构时,提供一个虚析构函数,能够使派生类对象在不同状态下正确调用析构函数,9.4纯虚函数和抽象类,纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本纯虚函数为各派生类提供一个公共界面纯虚函数说明形式:virtual类型函数名(参数表)=0;一个具有纯虚函数的基类称为抽象类。,9.4纯虚函数和抽象类,classpoint/*/;classshape;/抽象类pointcenter;public:pointwhere()returncenter;voidmove(pointp)center=p;draw();virtualvoidrotate(int)=0;/纯虚函数virtualvoiddraw()=0;/纯虚函数;.,shapex;/error,抽象类不能建立对象shape*p;/ok,可以声明抽象类的指针shapef();/error,抽象类不能作为函数返回类型voidg(shape);/error,抽象类不能作为传值参数类型shape/ok,可以声明抽象类的引用,例如:,9.4纯虚函数和抽象类,不能建立抽象类型存储空间,classpoint/*/;classshape;/抽象类pointcenter;public:pointwhere()returncenter;voidmove(pointp)center=p;draw();virtualvoidrotate(int)=0;/纯虚函数virtualvoiddraw()=0;/纯虚函数;.,classab_circle:publicshapeintradius;public:voidrotate(int);,例如:,ab_circle类仍为抽象类ab_circle:draw()、ab_circle:rotate()也是纯虚函数,9.4纯虚函数和抽象类,要使ab_circle成为非抽象类,必须作以下说明:classab_circle:publicshapeintradius;public:voidrotate(int);voiddraw();并提供ab_circle:draw()和ab_circle:rotate(int)的定义,/figure.hclassfigureprotected:doublex,y;public:voidset_dim(doublei,doublej=0)x=i;y=j;virtualvoidshow_area()=0;classtriangle:publicfigurepublic:voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;classsquare:publicfigurepublic:voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;classcircle:publicfigurepublic:voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,virtualvoidshow_area()=0;/纯虚函数,例9-6简单图形类,voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;,voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;,voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,9.4纯虚函数和抽象类,/figure.hclassfigureprotected:doublex,y;public:voidset_dim(doublei,doublej=0)x=i;y=j;virtualvoidshow_area()=0;classtriangle:publicfigurepublic:voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;classsquare:publicfigurepublic:voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;classcircle:publicfigurepublic:voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,virtualvoidshow_area()=0;/纯虚函数,voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;,voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;,voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,9.4纯虚函数和抽象类,例9-6简单图形类,#includeusingnamespacestd;#includefigure.hintmain()trianglet;/派生类对象squares;circlec;t.set_dim(10.0,5.0);t.show_area();s.set_dim(10.0,5.0);s.show_area();c.set_dim(9.0);c.show_area();,例9-6简单图形类,9.4纯虚函数和抽象类,/figure.hclassfigureprotected:doublex,y;public:voidset_dim(doublei,doublej=0)x=i;y=j;virtualvoidshow_area()=0;classtriangle:publicfigurepublic:voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;classsquare:publicfigurepublic:voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;classcircle:publicfigurepublic:voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,virtualvoidshow_area()=0;/纯虚函数,voidshow_area()coutTrianglewithhighxandbaseyhasanareaofx*0.5*yn;,voidshow_area()coutSquarewithdimensionx*yhasanareaofx*yn;,voidshow_area()coutCirclewithradiusx;couthasanareaof3.14*x*xn;,#includeusingnamespacestd;#includefigure.hintmain()figure*p;/声明抽象类指针trianglet;squares;circlec;p=,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalendl;,例9-7使用抽象类引用,voidfun(Number/Oct_type:Show(),9.4纯虚函数和抽象类,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalendl;,voidfun(Number/Oct_type:Show(),抽象类引用,9.4纯虚函数和抽象类,例9-7使用抽象类引用,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalendl;,voidfun(Number/Oct_type:Show(),函数调用,派生类对象,9.4纯虚函数和抽象类,例9-7使用抽象类引用,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalendl;,voidfun(Number/Oct_type:Show(),9.4纯虚函数和抽象类,例9-7使用抽象类引用,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalendl;,voidfun(Number/Oct_type:Show(),9.4纯虚函数和抽象类,例9-7使用抽象类引用,#includeusingnamespacestd;classNumberpublic:Number(inti)val=i;virtualvoidShow()=0;protected:intval;classHex_type:publicNumberpublic:Hex_type(inti):Number(i)voidShow()coutHexadecimal:hexvalendl;classDec_type:publicNumberpublic:Dec_type(inti):Number(i)voidShow()coutDecimal:decvalendl;classOct_type:publicNumberpublic:Oct_type(inti):Number(i)voidShow()coutOctal:octvalShow();,fun(,fun(,fun(,虚函数和多态性使成员函数根据调用对象的类型产生不同的动作多态性特别适合于实现分层结构的软件系统,便于对问题抽象时定义共性,实现时定义区别,9.5虚函数与多态的应用,9.5虚函数与多态的应用,9.5.1一个实例计算雇员工资,Employee,抽象类提供一般属性,共同操作界面,管理人员类提供特殊属
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药品票据凭证管理制度
- 药品销售订单管理制度
- 药店公司着装管理制度
- 药店柜台进出管理制度
- 菌棒接种车间管理制度
- 设备参数更改管理制度
- 设备定岗定机管理制度
- 设备标识标牌管理制度
- 设备生产进度管理制度
- 设备缺陷统计管理制度
- 2022年盐城市大丰区事业单位考试真题及答案
- 2017年福州市初中毕业班质量检测英语试卷及答案
- 性科学与生殖健康智慧树知到答案章节测试2023年武汉科技大学
- WS/T 227-2002临床检验操作规程编写要求
- GB/T 9254.1-2021信息技术设备、多媒体设备和接收机电磁兼容第1部分: 发射要求
- GB/T 40734-2021焊缝无损检测相控阵超声检测验收等级
- GB/T 24821-2009餐桌餐椅
- GB/T 18907-2002透射电子显微镜选区电子衍射分析方法
- GB/T 16432-2016康复辅助器具分类和术语
- GB 6245-2006消防泵
- 清洁消毒记录
评论
0/150
提交评论