1 / 15
文档名称:

C++语言程序设计实验答案-继承与派生.doc

格式:doc   大小:229KB   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C++语言程序设计实验答案-继承与派生.doc

上传人:帅气的小哥哥 2024/5/12 文件大小:229 KB

下载得到文件列表

C++语言程序设计实验答案-继承与派生.doc

相关文档

文档介绍

文档介绍:该【C++语言程序设计实验答案-继承与派生 】是由【帅气的小哥哥】上传分享,文档一共【15】页,该文档可以免费在线阅读,需要了解更多关于【C++语言程序设计实验答案-继承与派生 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。1实验07继承与派生〔4学时〕〔第7章继承与派生〕一、实验目的(1)学****声明和使用类的继承关系,声明派生类。(2)熟悉不同继承方式下对基类成员的访问控制。(3)学****利用虚基类解决二义性问题。二、实验任务7_1声明一个基类Animal。有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(intn)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。7_2声明一个基类BaseClass。有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。7_3声明一个车(vehicle)基类。具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。7_4以实验6中的People〔人员〕类为基类。派生出student〔学生〕类,添加属性:班号charclassNo[7];派生出teacher〔教师〕类,添加属性:职务charprincipalship[11]、部门chardepartment[21]。从student类中派生出graduate〔研究生〕类,添加属性:专业charsubject[21]、导师teacheradviser;从graduate类和teacher类派生出TA〔助教生〕类,注意虚基类的使用。重载相应的成员函数,测试这些类。类之间的关系如图7-1所示。2研究生专业导师函数日期年月日函数助教博士生教师职务部门函数学生班号函数人员姓名编号性别出生日期身份证号函数图7-1类图三、实验步骤1.〔编程〕声明基类Animal,成员变量age声明为私有的。构造派生类dog,在其成员函数SetAge(intn)中直接对age赋值时,会出现类似以下的错误提示:〔注:在桌面创立一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码〕用private时的结果:1>------已启动生成:工程:cpp,配置:DebugWin32------1>生成启动时间为2024-2-1811:10:35。1>InitializeBuildStatus:1>正在创立“Debug\〞,因为已指定“AlwaysCreate〞。1>pile:1>>f:\projects\cpp\cpp\(13):errorC2248:“Animal::age〞:无法访问private成员(在“Animal〞类中声明)1>f:\projects\cpp\cpp\(8):参见“Animal::age〞的声明1>f:\projects\cpp\cpp\(5):参见“Animal〞的声明31>f:\projects\cpp\cpp\(14):errorC2248:“Animal::age〞:无法访问private成员(在“Animal〞类中声明)1>f:\projects\cpp\cpp\(8):参见“Animal::age〞的声明1>f:\projects\cpp\cpp\(5):参见“Animal〞的声明1>1>生成失败。1>1>已用时间00:00:==========生成:成功0个,失败1个,最新0个,跳过0个==========把age改为公有变量后重新编译就可以了。程序名:。★程序及运行结果://#include<iostream>usingnamespacestd;classAnimal{private://private时出错//public://public和protected正确 intage;};classdog:publicAnimal{public: voidSetAge(intn){age=n;} intGetAge(){returnage;}};voidmain(){dogd;(3);cout<<"Age="<<()<<endl;}用private时的结果:1>------已启动生成:工程:cpp,配置:DebugWin32------1>生成启动时间为2024-2-1811:10:35。1>InitializeBuildStatus:1>正在创立“Debug\〞,因为已指定“AlwaysCreate〞。1>pile:1>>f:\projects\cpp\cpp\(13):errorC2248:“Animal::age〞:无法访问private成员(在“Animal〞类中声明)1>f:\projects\cpp\cpp\(8):参见“Animal::age〞的声明1>f:\projects\cpp\cpp\(5):参见“Animal〞的声明1>f:\projects\cpp\cpp\(14):errorC2248:“Animal::age〞:无法访问private成员(在“Animal〞类中声明)1>f:\projects\cpp\cpp\(8):参见“Animal::age〞的声明41>f:\projects\cpp\cpp\(5):参见“Animal〞的声明1>1>生成失败。1>1>已用时间00:00:==========生成:成功0个,失败1个,最新0个,跳过0个==========用public时的结果:2.〔编程〕声明一个基类BaseClass,构造其派生类DerivedClass。在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:。参考的运行结果:★程序及运行结果://#include<iostream>usingnamespacestd;classBaseClass{public: BaseClass(){cout<<"构造了一个BaseClass类的对象."<<endl;} ~BaseClass(){cout<<"析构了一个BaseClass类的对象."<<endl;}private: intNumber;};classDeriveClass:publicBaseClass{public: DeriveClass(){cout<<"构造了一个DeriveClass类的对象."<<endl;} ~DeriveClass(){cout<<"析构了一个DeriveClass类的对象."<<endl;}};voidmain(){DeriveClassa;}53.〔操作〕用调试功能跟踪程序lab7_2的执行过程。观察基类和派生类的构造函数和析构函数的执行情况。4.〔编程〕声明一个车(vehicle)虚基类。由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:。参考的运行结果:★程序及运行结果://#include<iostream>usingnamespacestd;classvehicle{//车类,作为基类protected: intMaxSpeed,Weight;//最大速度,重量public: voidRun(){cout<<"车vehicle类开始运行!"<<endl;} voidStop(){cout<<"车vehicle类停止运行!"<<endl;}};classbicycle:virtualpublicvehicle{//自行车类:公有继承虚基类vehicleprotected: intHeight;//高度};classmotorcar:virtualpublicvehicle{//汽车类:公有继承虚基类vehicleprotected: intSeatNum;//座位数6};classmotorcycle :publicbicycle,publicmotorcar{//摩托车类:公有继承自行车类和汽车类public: voidSetdata(intms,intwt,intht,intsn) {MaxSpeed=ms;Weight=wt;Height=ht;SeatNum=sn;}; voidShow(){ cout<<"最大速度:"<<MaxSpeed<<"重量:"<<Weight <<"高度:"<<Height<<"座位数:"<<SeatNum<<endl; }};voidmain(){ cout<<"int类型占用字节数:"<<sizeof(int)<<endl; cout<<"vehicle占用字节数:"<<sizeof(vehicle)<<endl; cout<<"bicycle占用字节数:"<<sizeof(bicycle)<<endl; cout<<"motorcar占用字节数:"<<sizeof(motorcar)<<endl; cout<<"motorcycle占用字节数:"<<sizeof(motorcycle)<<endl; motorcyclemt; (); (100,200,130,2); (); ();}为什么?按推算应该是:vehicle占用8字节;bicycle占用12字节;motorcar占用12字节;motorcycle占用16字节。5.〔验证〕把vehicle设置为非虚基类。再编译一次,此时系统报错,无法编译成功。这是因为假设不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。7访问vehicle的成员时指明继承路径后,可以纠正二义性错误,试修改程序,然后运行。程序的运行结果:(1)没有指明继承路径〔运行结果〕将上面的程序的bicycle类和motorcar类改为非虚基类公有继承vehicle类后,编译时出现二义(ambiguous)性错误:1>------已启动生成:工程:cpp,配置:DebugWin32------1>生成启动时间为2024-2-1811:23:32。1>InitializeBuildStatus:1>正在创立“Debug\〞,因为已指定“AlwaysCreate〞。1>pile:1>>f:\projects\cpp\cpp\(27):errorC2385:对“MaxSpeed〞的访问不明确1>可能是“MaxSpeed〞(位于基“vehicle〞中)1>也可能是“MaxSpeed〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(27):errorC2385:对“Weight〞的访问不明确1>可能是“Weight〞(位于基“vehicle〞中)1>也可能是“Weight〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(29):errorC2385:对“MaxSpeed〞的访问不明确1>可能是“MaxSpeed〞(位于基“vehicle〞中)1>也可能是“MaxSpeed〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(30):errorC2385:对“Weight〞的访问不明确1>可能是“Weight〞(位于基“vehicle〞中)1>也可能是“Weight〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(42):errorC2385:对“Run〞的访问不明确1>可能是“Run〞(位于基“vehicle〞中)1>也可能是“Run〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(42):errorC3861:“Run〞:找不到标识符1>f:\projects\cpp\cpp\(45):errorC2385:对“Stop〞的访问不明确1>可能是“Stop〞(位于基“vehicle〞中)1>也可能是“Stop〞(位于基“vehicle〞中)1>f:\projects\cpp\cpp\(45):errorC3861:“Stop〞:找不到标识符1>1>生成失败。1>1>已用时间00:00:==========生成:成功0个,失败1个,最新0个,跳过0个==========(2)指明继承路径〔程序及运行结果〕将vehicle中数据成员和函数成员指明路径。//#include<iostream>usingnamespacestd;classvehicle{//车类,作为基类8protected: intMaxSpeed,Weight;//最大速度,重量public: voidRun(){cout<<"车vehicle类开始运行!"<<endl;} voidStop(){cout<<"车vehicle类停止运行!"<<endl;}};classbicycle:publicvehicle{//自行车类:公有继承虚基类vehicleprotected: intHeight;//高度};classmotorcar:publicvehicle{//汽车类:公有继承虚基类vehicleprotected: intSeatNum;//座位数};classmotorcycle :publicbicycle,publicmotorcar{//摩托车类:公有继承自行车类和汽车类public: voidSetdatabicycle(intms,intwt,intht,intsn){ bicycle::MaxSpeed=ms;bicycle::Weight=wt;//修改,指明路径 Height=ht;SeatNum=sn; }; voidShowbicycle(){ cout<<"最大速度:"<<bicycle::MaxSpeed<<"重量:"<<bicycle::Weight <<"高度:"<<Height<<"座位数:"<<SeatNum<<endl;//修改,指明路径 }};voidmain(){ cout<<"int类型占用字节数:"<<sizeof(int)<<endl; cout<<"vehicle占用字节数:"<<sizeof(vehicle)<<endl; cout<<"bicycle占用字节数:"<<sizeof(bicycle)<<endl; cout<<"motorcar占用字节数:"<<sizeof(motorcar)<<endl; cout<<"motorcycle占用字节数:"<<sizeof(motorcycle)<<endl; motorcyclemt; ::Run();//修改,指明路径 (100,200,130,2); (); ::Stop();//修改,指明路径}〔人员〕类为基类,派生相应的类。按任务7_4的要求编写程序,并运行。参考的运行结果:★程序及运行结果:(1):People〔人员〕类的声明及成员函数的实现//#include<iostream>#include<cstring>10usingnamespacestd;classDate{private: intyy,mm,dd;public: Date(){ } Date(Date&d):yy(),mm(),dd(){}//增添 ~Date(){} intGetyy()const{returnyy;} intGetmm()const{returnmm;} intGetdd()const{returndd;} voidSetyy(inty){yy=y;} voidSetmm(intm){mm=m;} voidSetdd(intd){dd=d;}};classPeople{private: charname[11]; //姓名,增添 charnumber[7]; //编号,改为数组 charsex[3]; //男或女,改为数组 Datebirthday; //出生日期 charid[16]; //身份证号,改为数组public: People(){} People(People&p); ~People(){} voidGetname(charna[]){strcpy(na,name);} voidGetnumber(charnu[]){strcpy(nu,number);} voidGetsex(charse[]){strcpy(se,sex);} intGetbirthyy()const{();} intGetbirthmm()const{();} intGetbirthdd()const{();} voidGetid(chard[]){strcpy(d,id);} voidSetname(charna[]){strcpy(name,na);} voidSetnumber(charnu[]){strcpy(number,nu);} voidSetsex(charse[]){strcpy(sex,se);} voidSetbirthyy(inty){(y);} voidSetbirthmm(intm){(m);} voidSetbirthdd(intd){(d);}