




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章继承与多态习题根本概念与根底知识自测题填空题8.1.1如果类α继承了类β,那么类α称为〔1〕类,而类β称为〔2〕类。〔3〕类的对象可作为〔4〕类的对象处理,反过来不行,因为〔5〕。如果强制转换那么要注意〔6〕。答案:〔1〕基类〔2〕派生类〔3〕派生类〔4〕基类〔5〕派生类有一些新成员〔6〕只能派生类强制转换为基类8.1.2当用public继承从基类派生一个类时,基类的public成员成为派生类的〔1〕成员,protected成员成为派生类的〔2〕成员,对private成员是〔3〕。公有派生可以使其类的〔4〕,所以公有派生是主流。答案:〔1〕public成员〔2〕protected成员〔3〕不可访问〔4〕接口不变8.1.3利用继承能够实现〔1〕。这种实现缩短了程序开发的时间,VC++中的〔2〕很好地表达了这一点。答案:〔1〕代码的复用〔2〕MFC编程8.1.4一个派生类只有一个直接基类的情况称为〔1〕,而有多个直接基类的情况称为〔2〕。继承表达了类的〔3〕概念,这在MFC中得到了很好表现,MFC中只采用了〔4〕。答案:〔1〕单继承〔2〕多重继承〔3〕层次〔4〕单继承8.1.5C++中多态性包括两种多态性:〔1〕和〔2〕。前者是通过〔3〕实现的,而后者是通过〔4〕和〔5〕来实现的。答案:〔1〕编译时的〔2〕运行时的〔3〕函数和运算符的重载〔4〕类继承关系〔5〕虚函数8.1.6在基类中将一个成员函数说明成虚函数后,在其派生类中只要〔1〕、〔2〕和〔3〕完全一样就认为是虚函数,而不必再加关键字〔4〕。如有任何不同,那么认为是〔5〕而不是虚函数。除了非成员函数不能作为虚函数外,〔6〕、〔7〕和〔8〕也不能作为虚函数。答案:〔1〕同虚函数名〔2〕同参数表〔3〕同返回类型。如基类中返回基类指针,而派生类中返回派生类指针是允许的〔4〕virtual〔5〕重载〔6〕静态成员函数〔7〕内联函数〔8〕构造函数8.1.7纯虚函数定义时在函数参数表后加〔1〕,它说明程序员对函数〔2〕,其本质是将指向函数体的指针定为〔3〕。答案:〔1〕=0〔2〕不定义〔3〕NULL简答题构造函数和析构函数可以继承吗?派生类构造函数各局部的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各局部的执行次序是:调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。派生类的构造函数体中的操作。什么叫派生类的同名覆盖〔override〕?答:如果派生类声明了一个和某个基类成员同名的新成员〔当然如是成员函数,参数表也必须一样,否那么是重载〕,派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖〔override〕。派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的调用?为什么?答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比拟简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的存储方式。答:在多重继承是有可能出现同一基类的两个拷贝,为防止这种情况,可使用虚基类。虚基类〔virtualbaseclass〕定义方式如下:class派生类名:virtual访问限定符基类类名{...};class派生类名:访问限定符virtual基类类名{...};virtual关键字只对紧随其后的基类名起作用。如下派生:存储关系如(b),在职研究生类有两个Person拷贝。采用虚基类后存储关系如下:采用虚基类后在职研究生类储存图StudentGStudentEGStudentPersonStudent新成员GStudent新成员PersonEmployee新成员Person成员EGStudent新成员PersonPersonEmployee在职研究生类只有一个Person拷贝。简单表达派生类与基类的赋值兼容规那么。答:但凡基类所能解决的问题,公有派生类都可以解决。在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规那么称赋值兼容规那么。它包括以下情况:派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。在类中定义对象成员称为复合或嵌套,请比照复合与继承的异同之处。答:成员对象是嵌套的概念,使用成员对象中的成员,只能直接访问〔对象名加点号加成员名〕公有成员。在类的成员函数中不能直接访问和处理成员对象的私有和保护成员,而要通过成员对象的接口去间接访问和处理。某些应用中,对象成员可以代替继承中的基类。 基类在派生类中只能继承一个〔间接基类不在讨论之中〕不能同时安排两个,否那么成员名即使使用域分辨符也会发生冲突,但如果一定要用两个,只能采用成员对象。所以采用成员对象更加灵活。两者不是对立的,而是互为补充的。比拟派生与模板各自的优点。答:模板追求的是运行效率,而派生追求的是编程的效率。通用性是模板库的设计出发点之一,这是由泛型算法和函数对象等手段到达的。为了运行的效率,类模板是相互独立的,即独立设计,没有使用继承的思想。对类模板的扩展是采用适配子〔adapter〕来完成的。应该说派生类的目标之一也是代码的复用和程序的通用性,最典型的就是MFC,派生类的优点是可以由简到繁,逐步深入,程序编制过程中可以充分利用前面的工作,一步步完成一个复杂的任务。是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?答:不是。实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。为什么析构函数总是要求说明为虚函数?答:在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。根据赋值兼容规那么可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,那么必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数。我们总是要求将类设计成通用的,无论其他程序员怎样调用都必须保证不出错,所以必须把析构函数定义为虚函数。什么是抽象类?含有纯虚函数的类是抽象类吗?答:假设定义一个类,它只能用作基类来派生出新的类,而不能用来定义对象,那么称为抽象类。含有纯虚函数的类是抽象类。能否不提供源代码,做到用户自行把通用的软件转化为专用软件?怎样实现?答:能不提供源代码,做到用户自行把通用的软件转化为专用软件。动态联编不一定要源代码,可以只有头文件和对象文件的.obj文件。软件开发商可在不透露其秘密的情况下发行.obj形式的软件,然后由程序员利用继承机制,从所购得的类中派生出新类。能与软件开发商提供的类一起运行的软件也能与派生类一起运行,并能通过动态联编使用这些派生类中重定义的虚函数。比方通用的财务软件可以转化为某公司的专用软件。编程与综合练习题请用类的派生方式来组织以下动物实体与概念:动物,脊椎动物亚门,节肢动物门,鱼纲,鸟纲,爬行纲,哺乳纲,昆虫纲,鲨鱼,青鱼,海马,鹦鹉,海鸥,喜鹊,蝙蝠,翼龙,蜻蜓,金龟,扬子鳄,袋鼠,金丝猴,虎,蜈蚣,蜘蛛,蝗虫,知了,螃蟹,虾。解:动物派生出:脊椎动物亚门和节肢动物门。脊椎动物亚门派生出:鱼纲,鸟纲,爬行纲,哺乳纲。鱼纲派生出:鲨鱼,青鱼,海马。鸟纲派生出:鹦鹉,海鸥,喜鹊。爬行纲派生出:翼龙,金龟,扬子鳄。哺乳纲派生出:蝙蝠,袋鼠,金丝猴,虎。节肢动物门派生出:昆虫纲,蜈蚣〔多足纲〕,蜘蛛〔蜘形纲〕,螃蟹,虾〔甲壳纲〕。昆虫纲派生出:蜻蜓,蝗虫,知了。定义商品类及其多层的派生类。以商品类为基类。第一层派生出服装类、家电类、车辆类。第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。要求给出根本属性和派生过程中增加的属性。解:按题意没有操作,所以只列出数据成员,也不再检验#include<iostream.h>classCommodity{doubleprice;//价格charname[20];//商品名charmanufacturer[20];//生产厂家intitems;//数量};classClothing:publicCommodity{//服装类chartexture[20];//材料质地};classElectric_Appliance:publicCommodity{//家电类enum{Black,White}type;//黑白家电};classVehicle:publicCommodity{//车辆类intwheel_num;//车轮数量};classShirt:publicClothing{//衬衣类enum{Formal,Casual}Style;//式样:正式、休闲};classGarment:publicClothing{//外衣类enum{Jacket,Coat}Style;//式样:夹克、外套};classHat:publicClothing{//帽子类;enum{Winter,Summer,Spring_Autumn}Style;//季节风格};classShoes:publicClothing{//鞋子类enum{Winter,Summer,Spring_Autumn}Style;//季节风格};classAir_Cindition:publicElectric_Appliance{//空调boolwarm_cool;//是否冷暖floatpower;//功率};classTelevision:publicElectric_Appliance{//电视类intSize;//尺寸boolisColor;//是否彩色};classAcoustics:publicElectric_Appliance{//音响类intspeaker_num;//喇叭数目floatpower; //功率};classBicycle:publicVehicle{//自行车类intspeed_grades; //调速级数intwheel_size; //轮子大小};classCar:publicVehicle{//轿车类floatvolume; //排气量boolisSkylight; //是否有天窗intbox_num; //厢数};classMotorcycle:publicVehicle{//摩托车类floatvolume; //排气量};voidmain(){}以点〔point〕类为基类,重新定义矩形类和圆类。点为直角坐标点,矩形水平放置,由左下方的顶点和长宽定义。圆由圆心和半径定义。派生类操作判断任一坐标点是在图形内,还是在图形的边缘上,还是在图形外。缺省初始化图形退化为点。要求包括拷贝构造函数。编程测试类设计是否正确。解:#include<iostream.h>#include<math.h>constdoublePI=3.1415926535;classPoint{private:doublex,y;public: Point(){x=0;y=0;} Point(doublexv,doubleyv){x=xv;y=yv;} Point(Point&pt){x=pt.x;y=pt.y;}doublegetx(){returnx;}doublegety(){returny;}doubleArea(){return0;}voidShow(){cout<<"x="<<x<<''<<"y="<<y<<endl;}};classCircle:publicPoint{doubleradius;public: Circle(){radius=0;} Circle(doublexv,doubleyv,doublevv):Point(xv,yv){radius=vv;} Circle(Circle&cc):Point(cc){radius=cc.radius;}//拷贝构造函数doubleArea(){returnPI*radius*radius;}voidShow(){ cout<<"x="<<getx()<<'\t'<<"y="<<gety()<<'\t'<<"radius="<<radius<<endl;//访问基类的数据成员 }intposition(Point&pt){doubledistance=sqrt((getx()-pt.getx())*(getx()-pt.getx()) +(gety()-pt.gety())*(gety()-pt.gety()));doubles=distance-radius;if(s==0)return0;//在圆上elseif(s<0)return-1; //在圆内elsereturn1; //在圆外 }};classRectangle:publicPoint{doublewidth,length;public: Rectangle(){width=0;length=0;} Rectangle(doublexv,doubleyv,doublewv,doublelv):Point(xv,xv) { width=wv; length=lv; } Rectangle(Rectangle&rr):Point(rr){ width=rr.width; length=rr.length; }doubleArea(){returnwidth*length;}voidShow(){ cout<<"width="<<width<<'\t'<<"length="<<length<<endl; }intposition(Point&pt);};intRectangle::position(Point&pt){doubles1,s2; s1=(pt.getx()-getx());s2=(pt.gety()-gety());if(((s1==0||s1==width)&&s2<=length)||((s2==0||s2==length)&&s1<=width))return0;//在矩形上elseif(s1<width&&s2<length)return-1; //在矩形内elsereturn1; //在矩形外}voidmain(){ Circlecc1(3,4,5),cc2,cc3(cc1); Rectanglert1(0,0,6,8),rt2,rt3(rt1); Pointp1(0,0),p2(6,8),p3(3,3),p4(8,4),p5(8,8); cc1.Show(); cc2.Show(); rt1.Show(); rt2.Show(); cout<<"点p1:"; p1.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p1)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形内"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圆cc3:"<<'\t'; cc3.Show();switch(cc3.position(p1)){case0:cout<<"在圆上"<<endl;break;case-1:cout<<"在圆内"<<endl;break;case1:cout<<"在圆外"<<endl;break; } cout<<"点p2:"; p2.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p2)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形内"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圆cc3:"<<'\t'; cc3.Show();switch(cc3.position(p2)){case0:cout<<"在圆上"<<endl;break;case-1:cout<<"在圆内"<<endl;break;case1:cout<<"在圆外"<<endl;break; } cout<<"点p3:"; p3.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p3)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形内"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圆cc3:"<<'\t'; cc3.Show();switch(cc3.position(p3)){case0:cout<<"在圆上"<<endl;break;case-1:cout<<"在圆内"<<endl;break;case1:cout<<"在圆外"<<endl;break; } cout<<"点p4:"; p4.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p4)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形内"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圆cc3:"<<'\t'; cc3.Show();switch(cc3.position(p4)){case0:cout<<"在圆上"<<endl;break;case-1:cout<<"在圆内"<<endl;break;case1:cout<<"在圆外"<<endl;break; } cout<<"点p5:"; p5.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p5)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形内"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圆cc3:"<<'\t'; cc3.Show();switch(cc3.position(p5)){case0:cout<<"在圆上"<<endl;break;case-1:cout<<"在圆内"<<endl;break;case1:cout<<"在圆外"<<endl;break; }}几何形体的派生关系如下:对平面形体有长和面积,对立体有外表积和体积,对几何图形基类,周长、面积和体积应怎样计算〔用什么函数〕?对平面图形体积怎样计算〔用什么函数〕?对立体图形周长怎么计算〔用什么函数〕?要求实现运行时的多态性。请编程,并测试。解:运行时的多态性要用指针#include<iostream.h>#include<math.h>constdoublePI=3.1415926535;classGeometric_shape{//几何图形public:virtualdoubleperimeter()=0; //周长virtualdoublearea()=0; //面积virtualdoublevolume()=0; //体积virtualvoidShow(){};};classCircle:publicGeometric_shape{//圆doubleradius;public: Circle(){radius=0;} Circle(doublevv){radius=vv;}doubleperimeter(){return2.0*PI*radius;} //周长doublearea(){returnPI*radius*radius;} //面积doublevolume(){return0;} //体积voidShow(){cout<<"radius="<<radius<<endl;}};classRectangle:publicGeometric_shape{//矩形doublewidth,length;public: Rectangle(){width=0;length=0;}//长宽 Rectangle(doublewid,doublelen){ width=wid; length=len; } Rectangle(Rectangle&rr){ width=rr.width; length=rr.length; }doubleperimeter(){return2.0*(width+length);} //周长doublearea(){returnwidth*length;} //面积doublevolume(){return0;} //体积voidShow(){cout<<"width="<<width<<'\t'<<"length="<<length<<endl;}};classTriangle:publicGeometric_shape{//三角形doublea,b,c;public: Triangle(){a=0;b=0;c=0;} Triangle(doublev1,doublev2,doublev3){a=v1;b=v2;c=v3;}doubleperimeter(){returna+b+c;} //周长doublearea(){doubles=(a+b+c)/2.0;returnsqrt(s*(s-a)*(s-b)*(s-c)); } //面积doublevolume(){return0;} //体积voidShow(){cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl;}};classBox:publicRectangle{//长方体doubleheight;public: Box(){height=0;} Box(doublewid,doublelen,doubleheg):Rectangle(wid,len){height=heg;}doublevolume(){returnarea()*height;} //体积};classCylinder:publicCircle{//圆柱体doubleheight;public: Cylinder(){height=0;} Cylinder(doublevv,doubleheg):Circle(vv){height=heg;}doublevolume(){returnarea()*height;} //体积};classCone:publicCircle{//圆锥doubleheight;public: Cone(){height=0;} Cone(doublevv,doubleheg):Circle(vv){height=heg;}doublevolume(){returnarea()*height/3;} //体积};classT_pyramid:publicTriangle{//三棱锥doubleheight;public: T_pyramid(){height=0;} T_pyramid(doublev1,doublev2,doublev3,doubleheg):Triangle(v1,v2,v3){height=heg;}doublevolume(){returnarea()*height/3;} //体积};classT_prism:publicTriangle{//三棱柱doubleheight;public: T_prism(){height=0;} T_prism(doublev1,doublev2,doublev3,doubleheg):Triangle(v1,v2,v3){height=heg;}doublevolume(){returnarea()*height;} //体积};voidmain(){ Geometric_shape*gs; Circlecc1(10); Rectanglert1(6,8); Triangletg1(3,4,5);Boxbx1 Cylindercl1(10,3); Conecn1(10,3); T_pyramidtpy1(3,4,5,3); T_prismtpr1(3,4,5,3); cc1.Show();//静态 cout<<"圆周长:"<<cc1.perimeter()<<'\t'; cout<<"圆面积:"<<cc1.area()<<'\t'; cout<<"圆体积:"<<cc1.volume()<<endl; gs=&rt1;//动态 gs->Show(); cout<<"矩形周长:"<<gs->perimeter()<<'\t'; cout<<"矩形面积:"<<gs->area()<<'\t'; cout<<"矩形体积:"<<gs->volume()<<endl; gs=&tg1;//动态 gs->Show(); cout<<"三角形周长:"<<gs->perimeter()<<'\t'; cout<<"三角形面积:"<<gs->area()<<'\t'; cout<<"三角形体积:"<<gs->volume()<<endl; gs=&bx1;//动态 gs->Show(); cout<<"长方体底周长:"<<gs->perimeter()<<'\t'; cout<<"长方体底面积:"<<gs->area()<<'\t'; cout<<"长方体体积:"<<gs->volume()<<endl; gs=&cl1;//动态 gs->Show(); cout<<"圆柱体底周长:"<<gs->perimeter()<<'\t'; cout<<"圆柱体底面积:"<<gs->area()<<'\t'; cout<<"圆柱体体积:"<<gs->volume()<<endl; gs=&cn1;//动态 gs->Show(); cout<<"圆锥体底周长:"<<gs->perimeter()<<'\t'; cout<<"圆锥体底面积:"<<gs->area()<<'\t'; cout<<"圆锥体体积:"<<gs->volume()<<endl; gs=&tpy1;//动态 gs->Show(); cout<<"三棱锥底周长:"<<gs->perimeter()<<'\t'; cout<<"三棱锥底面积:"<<gs->area()<<'\t'; cout<<"三棱锥体积:"<<gs->volume()<<endl; gs=&tpr1;//动态 gs->Show(); cout<<"三棱柱底周长:"<<gs->perimeter()<<'\t'; cout<<"三棱柱底面积:"<<gs->area()<<'\t'; cout<<"三棱柱体积:"<<gs->volume()<<endl;}某公司雇员〔employee〕包括经理〔manager〕,技术人员〔technician〕和销售员〔salesman〕。开发部经理〔developermanger〕,既是经理也是技术人员。销售部经理〔salesmanager〕,既是经理也是销售员。以employ类为虚基类派生出manager,technician和salesman类;再进一步派生出developermanager和salesmanager类。employee类的属性包括姓名、职工号、工资级别,月薪〔实发根本工资加业绩工资〕。操作包括月薪计算函数〔pay()〕,该函数要求输入请假天数,扣去应扣工资后,得出实发根本工资。technician类派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为根本工资加业绩工资。salesman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为根本工资加业绩工资。manager类派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为根本工资加业绩工资。而developermanager类,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。salesamanager类,pay()函数那么是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。解:#include<iostream.h>#include<string.h>staticintGrades[]={500,600,750,1000,1400,2000,2800,4000};classemployee{protected:char*name;//姓名intID;//职工号intgrade;//工资级别doublesalary;//月doublebase_salary;//根本月薪doublecareer_salary;//业绩工资public: employee(char*=NULL,int=0,int=0);//星号与等号间一定要有空格,否那么理解成乘法 ~employee();virtualvoidpay();//月薪计算函数voidshow();doublegetsalary(){returnsalary;}doublegetbase_salary(){returnbase_salary;}doublegetcareer_salary(){returncareer_salary;}};employee::employee(char*nn,intid,intgr){ if(nn==NULL)name=NULL;elsename=newchar[strlen(nn)+1]; strcpy(name,nn); ID=id; grade=gr; salary=0;//月薪 base_salary=0;//根本月薪 career_salary=0;//业绩工资}employee::~employee(){if(name!=NULL)delete[]name;}voidemployee::show(){ cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;}voidemployee::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; base_salary=Grades[grade]*(23-days)/23; career_salary=base_salary/2;//普通员工业绩工资为根本工资的一半 salary=base_salary+career_salary;}classmanager:virtualpublicemployee{//虚基类protected:doubleprize;//固定奖金额doublefactor;//业绩系数public: manager(char*=NULL,int=0,int=0,double=0);voidpay();};manager::manager(char*nn,intid,intgr,doublepr):employee(nn,id,gr){ prize=pr;//固定奖金额 factor=0;}voidmanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; base_salary=Grades[grade]*(23-days)/23; career_salary=prize*factor*(23-days)/23; salary=base_salary+career_salary;}classtechnician:virtualpublicemployee{protected:doublehours;//月工作时数doubleperhour;//每小时附加酬金doubleshfactor;//研究进度系数public: technician(char*=NULL,int=0,int=0,double=0);voidpay();};technician::technician(char*nn,intid,intgr,doublephr):employee(nn,id,gr){ hours=0; perhour=phr;//每小时附加酬金 shfactor=0;}voidtechnician::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入研究进度系数:\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23; career_salary=perhour*hours*shfactor*(23-days)/23; salary=base_salary+career_salary;}classsalesman:virtualpublicemployee{protected:doubleamount;//销售额doubleslfactor;//提成比例public: salesman(char*=NULL,int=0,int=0,double=0);voidpay();};salesman::salesman(char*nn,intid,intgr,doubleslfac):employee(nn,id,gr){ amount=0; slfactor=slfac;//提成比例}voidsalesman::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入销售额:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23; career_salary=amount*slfactor; salary=base_salary+career_salary;}classdevelopermanager:publicmanager,publictechnician{public: developermanager(char*=NULL,intid=0,intgr=0,doublepr=0,doublephr=0);voidpay();};developermanager::developermanager(char*nn,intid,intgr,doublepr,doublephr) :manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}voiddevelopermanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; cout<<"请输入研究进度系数:\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23;//根本工资 career_salary=perhour*hours*shfactor*(23-days)/23;//技术人员奖金 career_salary+=prize*factor*(23-days)/23;//加经理业绩工资 career_salary/=2; salary=base_salary+career_salary;}classsalesmanager:publicmanager,publicsalesman{public: salesmanager(char*=NULL,int=0,int=0,doublepr=0,doubleslfac=0);voidpay();};salesmanager::salesmanager(char*nn,intid,intgr,doublepr,doubleslfac) :manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}voidsalesmanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; cout<<"请输入销售额:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23;//根本工资 career_salary=prize*factor*(23-days)/23;//经理业绩工资 career_salary/=2; career_salary+=amount*slfactor;//加销售业绩工资 salary=base_salary+career_salary;}voidmain(){ employeeeml1("张伟",10012,0),*emlp; managermag1("姚婕",20005,4,1000); techniciantec1("王茜",30047,5,10); salesmansal1("朱明",40038,2,0.05); developermanagerdem1("沈俊",50069,6,1500,12); salesmanagersam1("况钟",60007,3,1000,0.05); eml1.pay(); eml1.show(); mag1.pay(); mag1.show(); tec1.pay(); tec1.show(); sal1.pay(); sal1.show(); emlp=&dem1; emlp->pay(); emlp->show(); emlp=&sam1; emlp->pay(); emlp->show();}为上题添加拷贝构造函数,并测试是否正确。解:#include<iostream.h>#include<string.h>staticintGrades[]={500,600,750,1000,1400,2000,2800,4000};classemployee{protected:char*name;//姓名intID;//职工号intgrade;//工资级别doublesalary;//月doublebase_salary;//根本月薪doublecareer_salary;//业绩工资public: employee(char*=NULL,int=0,int=0);//星号与等号间一定要有空格,否那么理解成乘法 employee(employee&); ~employee();virtualvoidpay();//月薪计算函数voidshow();doublegetsalary(){returnsalary;}doublegetbase_salary(){returnbase_salary;}doublegetcareer_salary(){returncareer_salary;}};employee::employee(char*nn,intid,intgr){ if(nn==NULL)name=NULL;elsename=newchar[strlen(nn)+1]; strcpy(name,nn); ID=id; grade=gr; salary=0;//月薪 base_salary=0;//根本月薪 career_salary=0;//业绩工资}employee::employee(employee&emp){if(!=NULL){ name=newchar[strlen()+1]; strcpy(name,); }elsename=NULL; ID=emp.ID; grade=emp.grade; salary=emp.salary;//月薪 base_salary=emp.base_salary;//根本月薪 career_salary=emp.career_salary;//业绩工资}employee::~employee(){if(name!=NULL)delete[]name;}voidemployee::show(){ cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;}voidemployee::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; base_salary=Grades[grade]*(23-days)/23; career_salary=base_salary/2;//普通员工业绩工资为根本工资的一半 salary=base_salary+career_salary;}classmanager:virtualpublicemployee{//虚基类protected:doubleprize;//固定奖金额doublefactor;//业绩系数public: manager(char*=NULL,int=0,int=0,double=0); manager(manager&mag);voidpay();};manager::manager(manager&mag):employee(mag){//按赋值兼容规那么mag可为employee的实参 prize=mag.prize; factor=mag.factor;}manager::manager(char*nn,intid,intgr,doublepr):employee(nn,id,gr){ prize=pr;//固定奖金额 factor=0;}voidmanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; base_salary=Grades[grade]*(23-days)/23; career_salary=prize*factor*(23-days)/23; salary=base_salary+career_salary;}classtechnician:virtualpublicemployee{protected:doublehours;//月工作时数doubleperhour;//每小时附加酬金doubleshfactor;//研究进度系数public: technician(char*=NULL,int=0,int=0,double=0); technician(technician&);voidpay();};technician::technician(technician&tech):employee(tech){ hours=tech.hours;//月工作时数 perhour=tech.perhour;//每小时附加酬金 shfactor=tech.shfactor;//研究进度系数}technician::technician(char*nn,intid,intgr,doublephr):employee(nn,id,gr){ hours=0; perhour=phr;//每小时附加酬金 shfactor=0;}voidtechnician::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入研究进度系数:\n"; hours=8*(23-days); cin>>shfactor; base_salary=Grades[grade]*(23-days)/23; career_salary=perhour*hours*shfactor*(23-days)/23; salary=base_salary+career_salary;}classsalesman:virtualpublicemployee{protected:doubleamount;//销售额doubleslfactor;//提成比例public: salesman(char*=NULL,int=0,int=0,double=0); salesman(salesman&);voidpay();};salesman::salesman(char*nn,intid,intgr,doubleslfac):employee(nn,id,gr){ amount=0; slfactor=slfac;//提成比例}salesman::salesman(salesman&sale):employee(sale){ amount=sale.amount;//销售额 slfactor=sale.slfactor;//提成比例}voidsalesman::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入销售额:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23; career_salary=amount*slfactor; salary=base_salary+career_salary;}classdevelopermanager:publicmanager,publictechnician{public: developermanager(char*=NULL,intid=0,intgr=0,doublepr=0,doublephr=0); developermanager(developermanager&);voidpay();};developermanager::developermanager(char*nn,intid,intgr,doublepr,doublephr) :manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}developermanager::developermanager(developermanager&deman) :manager(deman),technician(deman),employee(deman){}voiddevelopermanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; cout<<"请输入研究进度系数:\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23;//根本工资 career_salary=perhour*hours*shfactor*(23-days)/23;//技术人员奖金 career_salary+=prize*factor*(23-days)/23;//加经理业绩工资 career_salary/=2; salary=base_salary+career_salary;}classsalesmanager:publicmanager,publicsalesman{public: salesmanager(char*=NULL,int=0,int=0,doublepr=0,doubleslfac=0); salesmanager(salesmanager&);voidpay();};salesmanager::salesmanager(char*nn,intid,intgr,doublepr,doubleslfac) :manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}salesmanager::salesmanager(salesmanager&salman) :manager(salman),salesman(salman),employee(salman){}voidsalesmanager::pay(){intdays; cout<<"请输入请假天数:\n"; cin>>days; cout<<"请输入业绩系数:\n"; cin>>factor; cout<<"请输入销售额:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23;//根本工资 career_salary=prize*factor*(23-days)/23;//经理业绩工资 career_salary/=2; career_salary+=amount*slfactor;//加销售业绩工资 salary=base_salary+career_salary;}voidmain(){ employeeeml1("张伟",10012,0),*emlp; managermag1("姚婕",20005,4,1000); techniciantec1("王茜",30047,5,10); salesmansal1("朱明",40038,2,0.05); developermanagerdem1("沈俊",50069,6,1500,12); salesmanagersam1("况钟",60007,3,1000,0.05); eml1.pay(); eml1.show(); mag1.pay(); mag1.show(); tec1.pay(); tec1.show(); sal1.pay(); sal1.show(); emlp=&dem1; emlp->pay(); emlp->show(); emlp=&sam1; emlp->pay(); emlp->show(); cout<<endl; employeeeml0(eml1); managermag0(mag1); techniciantec0(tec1); salesmansal0(sal1); developermanagerdem0(dem1); salesmanagersam0(sam1); eml0.show(); mag0.show(); tec0.show(); sal0.show(); emlp=&dem0; emlp->show(); emlp=&sam0; emlp->show();}采用虚函数实现多态性来建立通用的双向链表派生类。参考【例8.10】和【例7.7】。解://ep8_9.h#include<iostream.h>//首先看结点组织,采用结点类加数据类classObject{//数据类为抽象类public: Object(){}virtualintCompare(Object&)=0;//纯虚函数virtualvoidPrint()=0;//纯虚函数virtual~Object(){}//析构函数可为虚函数,构造函数不行};classDblNode{ Object*info;//数据域用指针指向数据类对象 DblNode*llink,*rlink;//前驱〔左链〕、后继〔右链〕指针public: DblNode();//生成头结点的构造函数~DblNode();voidLinkinfo(Object*obj);friendclassDblList;//以DblList为友元类,DblList可直接访问DblNode的私有函数,与结构一样方便,但更平安};DblNode::DblNode(){info=NULL;llink=rlink=NULL;}DblNode::~DblNode(){ cout<<"删除结点类"<<'\t';deleteinfo;//释放数据域}voidDblNode::Linkinfo(Object*obj){info=obj;}//再定义双链表类,选择常用操作classDblList{ DblNode*head,*current;public: DblList();//构造函数,生成头结点(空链表) ~DblList();//析构函数voidMakeEmpty();//清空链表,只余表头结点voidInsertFront(DblNode*p);//可用来向前生成链表,在表头插入一个结点voidInsertRear(DblNode*p);//可用来向后生成链表,在表尾添加一个结点voidInsertOrder(DblNode*p);//按升序生成链表 DblNode*CreatNode();//创立一个结点(孤立结点) DblNode*DeleteNode(DblNode*p);//删除指定结点voidPrintList();//打印链表的数据域intLength();//计算链表长度 DblNode*Find(Object&obj);//搜索数据域与定值相同的结点,返回该结点的地址//其它操作};DblList::DblList(){//建立表头结点 head=newDblNode(); head->rlink=head->llink=head; current=NULL;}DblList::~DblList(){ MakeEmpty();//清空链表 cout<<"删除头结点:";deletehead;}voidDblList::MakeEmpty(){ DblNode*tempP;while(head->rlink!=head){ tempP=head->rlink; head->rlink=tempP->rlink;//把头结点后的第一个节点从链中脱离 tempP->rlink->llink=head;//处理左指针deletetempP;//删除(释放)脱离下来的结点 } current=NULL;//current指针恢复}voidDblList::InsertFront(DblNode*p){ p->llink=head;//注意次序 p->rlink=head->rlink; head->rlink->llink=p; head->rlink=p;//最后做}voidDblList::InsertRear(DblNode*p){ p->rlink=head;//注意次序 p->llink=head->llink; head->llink->rlink=p; head->llink=p;//最后做}voidDblList::InsertOrder(DblNode*p){if(head==head->llink){ p->llink=head;//注意次序 p->rlink=head->rlink; head->rlink->llink=p; head->rlink=p;//最后做 }else{ current=head->rlink;while(current!=head){if(current->info->Compare(*(p->info))>0)break;//找第一个比插入结点大的结点 current=current->rlink; } p->rlink=current;//注意次序 p->llink=current->llink; current->llink->rlink=p; current->llink=p;//最后做 }}DblNode*DblList::CreatNode(){//建立新节点 current=newDblNode();returncurrent;}DblNode*DblList::DeleteNode(DblNode*p){ current=head->rlink;while(current!=head&¤t!=p)current=current->rlink;if(current==head)current=NULL;else{//结点摘下 p->llink->rlink=p->rlink; p->rlink->llink=p->llink; p->rlink=p->llink=NULL; }returncurrent;}DblNode*DblList::Find(Object&obj){//对抽象类只能用“引用〞 current=head->rlink;while(current!=head&¤t->info->Compare(obj)!=0)current=current->rlink;if(current==head)current=NULL;returncurrent;//搜索成功返回该结点地址,不成功返回NULL}voidDblList::PrintList(){ current=head->rlink;while(current!=head){ current->info->Print(); current=current->rlink; } cout<<endl;}DblList::Length(){intcount=0; current=head->rlink;while(current!=head){ count++; current=current->rlink; }returncount;}//ep8_9.cpp#include"ep8_9.h"#include<string.h>classStringObject:publicObject{char*sptr;public: StringObject(); StringObject(char*); ~StringObject();intCompare(Object&);voidPrint();};StringObject::StringObject(){sptr=NULL;}StringObject::StringObject(char*s){ sptr=newchar[strlen(s)+1];//加一不可少,否那么串结束符冲了其他信息,析构会出错! strcpy(sptr,s);}StringObject::~StringObject(){//虚函数重定义。撤销时可释放字符串if(sptr)delete[]sptr; cout<<"删除字符串类"<<endl;}intStringObject::Compare(Object&obj){//虚函数 StringObject&temp=(StringObject&)obj;return(strcmp(sptr,temp.sptr));}voidStringObject::Print(){cout<<sptr<<'\t';}//虚函数voidmain(){ DblNode*P1; StringObject*p; DblListlist1,list2,list3;char*a[5]={"dog","cat","bear","sheep","ox"},*sp="cat";inti;for(i=0;i<5;i++){ p=newStringObject(a[i]);//建立数据对象 P1=list1.CreatNode();//建立结点 P1->Linkinfo(p);//数据对象连接到结点 list1.InsertFront(P1);//向前生成list1 p=newStringObject(a[i]); P1=list2.CreatNode(); P1->Linkinfo(p); list2.InsertRear(P1);//向后生成list2 } list1.PrintList(); cout<<"list1长度:"<<list1.Length()<<endl; list2.PrintList(); cout<<"要求删除的字符串\"cat\""<<endl; p=newStringObject(sp);//为了程序的通用性只能多一次转换 P1=list1.Find(*p);deletep;if(P1!=NULL){ cout<<"删除cat:"<<endl; P1=list1.DeleteNode(P1);deleteP1; list1.PrintList(); cout<<"list1长度:"<<list1.Length()<<endl; }elsecout<<"未找到"<<endl; cout<<"清空list1:"<<endl; list1.MakeEmpty();//清空list1 list1.PrintList();for(i=0;i<5;i++){ p=newStringObject(a[i]); P1=list3.CreatNode(); P1->Linkinfo(p); list3.InsertOrder(P1);//升序创立list3 } list3.PrintList(); cout<<"程序结束:"<<endl;}矩形法〔rectangle〕积分近似计算公式为:梯形法〔ladder〕积分近似计算公式为:辛普生法〔simpson〕积分近似计算公式〔n为偶数〕为:被积函数用派生类引入,被积函数定义为纯虚函数。基类〔integer〕成员数据包括:积分上下限b和a;分区数n;步长step=(b-a)/n,积分值result。定义积分函数integerate()为虚函数,它只显示提示信息。派生的矩形法类〔rectangle〕重定义integerate(),采用矩形法作积分运算。派生的梯形法类〔ladde
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游酒店服务行业技术应用报告
- 在线学习平台的设计与开发解决方案
- 肿瘤内科总论复习试题
- 电商直播带货全链路服务运营优化方案
- 储能投资收益影响因素探讨
- 游戏引擎应用开发与优化实战手册
- 农业生产机械化服务体系方案
- 三农村特色三农产品网络销售模式指南
- 自动化办公流程设计与优化指南
- 2025年智能食品营养秤项目合作计划书
- 2025-2030年中国发酵豆粕行业运行态势及投资前景规划研究报告
- 酒店建设项目施工总承包合同
- 博物馆疫情防控方案与参观人数控制
- 2025年政府采购代理机构考试题库及答案
- 第14课《第一次世界大战》中职高一下学期高教版(2023)世界历史全一册
- 2024年司法考试完整真题及答案
- 湖南师范大学某中学2024届高三摸底(高二期末)考试数学试卷(含答案)
- 树木高空修剪安全施工方案
- 以租代购合同范例
- 第八章:农业科技成果转化
- 水库周边绿化养护方案
评论
0/150
提交评论