您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 继承和派生习题与解析
继承和派生习题与解析1分析以下程序的执行结果#includeiostream.hclassbase{public:base(){coutconstructingbaseclassendl;}~base(){coutdestructingbaseclassendl;}};classsubs:publicbase{public:subs(){coutconstructingsubclassendl;}~subs(){coutdestructingsubclassendl;}};voidmain(){subss;}解:本题说明单继承情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类。所以输出为:constructingbaseclassconstructingsubclassdestructingsubclassdestrcutingbaseclass注意:在单继承情况下,首先调用基类的构造函数,随后调用派生类的构造函数,析构函数的调用顺序则正好相反。2分析以下程序的执行结果:#includeiostream.hclassbase{intn;public:base(inta){coutconstructingbaseclassendl;n=a;coutn=nendl;}~base(){coutdestructingbaseclassendl;}};classsubs:publicbase{basebobj;intm;public:subs(inta,intb,intc):base(a),bobj(c){coutconstructingsubcassendl;m=b;coutm=mendl;}~subs(){coutdestructingsubclassendl;}};voidmain(){subss(1,2,3);}解:本题说明派生类中含有对象成员情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类,subs类的构造函数中含有对象成员。所以输出为:constrcutingbaseclassn=1constructingbaseclassn=3constructingsubclassm=2destructingsubclassdestructingbaseclassdestructingbaseclass注意:当派生类中含有对象成员时,构造函数的调用顺序如下:1)基类的构造函数2)对象成员的构造函数3)派生类的构造函数析构函数的调用顺序与之相反3分析以下程序的执行结果#includeiostream.hclassA{public:intn;};classB:publicA{};classC:publicA{};classD:publicB,publicC{intgetn(){returnB::n;}};voidmain(){Dd;d.B::n=10;d.C::n=20;coutd.B::n,d.C::nendl;}解:D类是从类B和类C派生的,而类B和类C又都是从类A派生的,但各有自己的副本。所以对于对象d,d.B::n与d.C::n是两个不同的数据成员它们互无联系。所以输出为:10,204分析以下程序的执行结果#includeiostream.hclassA{public:intn;};classB:virtualpublicA{};classC:virtualpublicA{};classD:publicB,publicC{intgetn(){returnB::n;}};voidmain(){Dd;d.B::n=10;d.C::n=20;coutd.B::n,d.C::nendl;}解:D类是从类B和类C派生的,而类B和类C又都是从类A派生,但这是虚继承关系即是虚基类因此和共用一个的副本所以对于对象d,d.B::n与d.C::n是一个成员。所以输出为:20,206编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight。小车类car是它的私有派生类其中包含载人数passenger_load。卡车类truck是vehicle的私有派生类其中包含载人数passenger_load和载重量payload,每个类都有相关数据的输出方法。解:vehicle类是基类由它派生出car类和truck类将公共的属性和方法放在vehicle类中。本题程序如下:#includeiostream.hclassvehicle//定义汽车类{protected:intwheels;//车轮数floatweight;//重量public:vehicle(intwheels,floatweight);intget_wheels();floatget_weight();voidshow();};classcar:privatevehicle//定义小车类{intpassenger_load;//载人数public:car(intwheels,floatweight,intpassengers=4);intget_passengers();voidshow();};classtruck:privatevehicle//定义卡车类{intpassenger_load;//载人数floatpayload;//载重量public:truck(intwheels,floatweight,intpassengers=2,floatmax_load=24000.00);intget_passengers();floatefficiency();voidshow();};vehicle::vehicle(intwheels,floatweight){vehicle::wheels=wheels;vehicle::weight=weight;}intvehicle::get_wheels(){returnwheels;}floatvehicle::get_weight(){returnweight/wheels;}voidvehicle::show(){cout车轮:wheels个endl;cout重量:weight公斤endl;}car::car(intwheels,floatweight,intpassengers):vehicle(wheels,weight){passenger_load=passengers;}intcar::get_passengers(){returnpassenger_load;}voidcar::show(){cout车型:小车endl;vehicle::show();cout载人:passenger_load人endl;coutendl;}truck::truck(intwheels,floatweight,intpassengers,floatmax_load):vehicle(wheels,weight){passenger_load=passengers;payload=max_load;}inttruck::get_passengers(){returnpassenger_load;}floattruck::efficiency(){returnpayload/(payload+weight);}voidtruck::show(){cout车型:卡车endl;vehicle::show();cout载人:passenger_load人endl;cout效率:efficiency()endl;coutendl;}voidmain(){carcar1(4,2000,5);trucktru1(10,8000,3,340000);cout输出结果endl;car1.show();tru1.show();}输出结果车型:小车车轮:4个重量:2000公斤载人:5人车型:卡车车轮:10个重量:8000公斤载人:3人效率:0.9770127设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。解:circle类包含私有数据成员radius和求圆面积的成员函数getarea();table类包含私有数据成员height和返回高度的成员函数getheight()。roundtable类继承所有上述类的数据成员和成员函数,添加了私有数据成员color和相应的成员函数。本题程序如下:#includeiostream.h#includestring.hclasscircle{doubleradius;public:circle(doubler){radius=r;}doublegetarea(){returnradius*radius*3.14;}};classtable{doubleheight;public:table(doubleh){height=h;}doublegetheight(){returnheight;}};classroundtable:publictable,publiccircle{char*color;public:roundtable(doubleh,doubler,charc[]):circle(r),table(h){color=newchar[strlen(c)+1];strcpy(color,c);}char*getcolor(){returncolor;}};voidmain(){roundtablert(0.8,1.2,黑色);cout圆桌属性数据:endl;cout高度:rt.getheight()米endl;cout面积:rt.getarea()平方米endl;cout颜色:rt.getcolor()endl;}本程序的执行结果如下:圆桌属性数据:高度:0.8米面积:4.5216平方米颜色:黑色8设计一个虚基类base,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关的成员函数。再由base派生出工程师类engineer,包含职称和专业私有数据成员以及相关的成员函数。然后由leader和engineer类派生出主任工程师类chairman。采用一些数据进行测试。解:由于chairman类从leader类和engineer类派生,而leader类和engineer类都是从base类派生的,所以为了使base只存一个副本,必须采用虚拟派生的方法。本题程序如下:#includeiostream.h#includestring.hclassbase//基类{char*name;//姓名intage;//年龄public:base(){}voidsetname(charna[]){name=newchar[strlen(na)+1];strcpy(name,na);}voidsetage(inta){age=a;}char*getname(){returnname;}intgetage(){returnage;}};classleader:virtualpublicbase//领导类{char*job;//职务char*dep;//部门public:leader(){}voidsetjob(charjb[]){job=newchar[strlen(jb)+1];strcpy(job,jb);}voidsetdep(chardp[]){dep=newchar[strlen(dp)+1];strcpy(dep,dp);}char*getjob()
本文标题:继承和派生习题与解析
链接地址:https://www.777doc.com/doc-7337648 .html