《C++语言程序设计实验答案-继承与派生(共15页).doc》由会员分享,可在线阅读,更多相关《C++语言程序设计实验答案-继承与派生(共15页).doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验07 继承与派生(4学时)(第7章 继承与派生)一、实验目的(1) 学习声明和使用类的继承关系,声明派生类。(2) 熟悉不同继承方式下对基类成员的访问控制。(3) 学习利用虚基类解决二义性问题。二、实验任务7_1 声明一个基类Animal。有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。7_2 声明一个基类BaseClass。有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。7_3 声明一个
2、车(vehicle)基类。具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。7_4 以实验6中的People(人员)类为基类。派生出student(学生)类,添加属性:班号char classNo7;派生出te
3、acher(教师)类,添加属性:职务char principalship11、部门char department21。从student类中派生出graduate(研究生)类,添加属性:专业char subject21、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。类之间的关系如图7-1所示。研究生 专业 导师 函数 日期 年 月 日 函数 助教博士生 教师 职务 部门 函数 学生 班号 函数 人员 姓名 编号 性别 出生日期 身份证号 函数 图7-1 类图三、实验步骤1.(编程)声明基类Ani
4、mal,成员变量age声明为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)用private时的结果:1- 已启动生成: 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:10:35。1InitializeBuildStatus:1 正在创建“Debugcpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。1ClCompile:1 main.cpp1
5、f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1 f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1 f:projectscppcppmain.cpp(5) : 参见“Animal”的声明1f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1 f:projectscppcppmain.cpp(8) :
6、 参见“Animal:age”的声明1 f:projectscppcppmain.cpp(5) : 参见“Animal”的声明11生成失败。11已用时间 00:00:03.28= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =把age改为公有变量后重新编译就可以了。程序名:lab7_1.cpp。 程序及运行结果:/lab7_1.cpp#include using namespace std;class Animalprivate: /private时出错/public:/public和protected正确int age;class dog:public Animalpub
7、lic:void SetAge(int n) age=n; int GetAge() return age; ;void main() dog d; d.SetAge(3); coutAge=d.GetAge()- 已启动生成: 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:10:35。1InitializeBuildStatus:1 正在创建“Debugcpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。1ClCompile:1 main.cpp1f:projectscppcppmain.cpp(13): e
8、rror C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1 f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1 f:projectscppcppmain.cpp(5) : 参见“Animal”的声明1f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1 f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1 f:projectsc
9、ppcppmain.cpp(5) : 参见“Animal”的声明11生成失败。11已用时间 00:00:03.28= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =用public时的结果:2.(编程)声明一个基类BaseClass,构造其派生类DerivedClass。在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。参考的运行结果: 程序及运行结果:/lab7_2.cpp#include using namespace std;class BaseClasspublic:BaseClass() cout构造了一个
10、BaseClass类的对象.endl; BaseClass() cout析构了一个BaseClass类的对象.endl; private:int Number;class DeriveClass:public BaseClasspublic:DeriveClass() cout构造了一个DeriveClass类的对象.endl; DeriveClass() cout析构了一个DeriveClass类的对象.endl; ;void main() DeriveClass a; 3.(操作)用调试功能跟踪程序lab7_2的执行过程。观察基类和派生类的构造函数和析构函数的执行情况。4.(编程)声明一个
11、车(vehicle)虚基类。由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:lab7_3.cpp。参考的运行结果: 程序及运行结果:/lab7_3.cpp#include using namespace std;class vehicle/车类,作为基类protected:int MaxSpeed,Weight;/最大速度,重量public:void Run() cout车vehicle类开始运行!endl; void Stop
12、() cout车vehicle类停止运行!endl; ;class bicycle:virtual public vehicle/自行车类:公有继承虚基类vehicleprotected:int Height;/高度;class motorcar:virtual public vehicle/汽车类:公有继承虚基类vehicleprotected:int SeatNum;/座位数;class motorcycle:public bicycle,public motorcar/摩托车类:公有继承自行车类和汽车类public:void Setdata(int ms,int wt,int ht,in
13、t sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=sn; ;void Show()cout最大速度:MaxSpeed 重量:Weight 高度:Height 座位数:SeatNumendl;void main()coutint类型占用字节数: sizeof(int)endl;coutvehicle占用字节数: sizeof(vehicle)endl;coutbicycle占用字节数: sizeof(bicycle)endl;coutmotorcar占用字节数: sizeof(motorcar)endl;coutmotorcycle占用字节数: s
14、izeof(motorcycle)- 已启动生成: 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:23:32。1InitializeBuildStatus:1 正在创建“Debugcpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。1ClCompile:1 main.cpp1f:projectscppcppmain.cpp(27): error C2385: 对“MaxSpeed”的访问不明确1 可能是“MaxSpeed”(位于基“vehicle”中)1 也可能是“MaxSpeed”(位于基“vehicle”中
15、)1f:projectscppcppmain.cpp(27): error C2385: 对“Weight”的访问不明确1 可能是“Weight”(位于基“vehicle”中)1 也可能是“Weight”(位于基“vehicle”中)1f:projectscppcppmain.cpp(29): error C2385: 对“MaxSpeed”的访问不明确1 可能是“MaxSpeed”(位于基“vehicle”中)1 也可能是“MaxSpeed”(位于基“vehicle”中)1f:projectscppcppmain.cpp(30): error C2385: 对“Weight”的访问不明确1
16、可能是“Weight”(位于基“vehicle”中)1 也可能是“Weight”(位于基“vehicle”中)1f:projectscppcppmain.cpp(42): error C2385: 对“Run”的访问不明确1 可能是“Run”(位于基“vehicle”中)1 也可能是“Run”(位于基“vehicle”中)1f:projectscppcppmain.cpp(42): error C3861: “Run”: 找不到标识符1f:projectscppcppmain.cpp(45): error C2385: 对“Stop”的访问不明确1 可能是“Stop”(位于基“vehicle”
17、中)1 也可能是“Stop”(位于基“vehicle”中)1f:projectscppcppmain.cpp(45): error C3861: “Stop”: 找不到标识符11生成失败。11已用时间 00:00:01.07= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =(2) 指明继承路径(程序及运行结果)将vehicle中数据成员和函数成员指明路径。/lab7_3.cpp#include using namespace std;class vehicle/车类,作为基类protected:int MaxSpeed,Weight;/最大速度,重量public:void
18、Run() cout车vehicle类开始运行!endl; void Stop() cout车vehicle类停止运行!endl; ;class bicycle:public vehicle/自行车类:公有继承虚基类vehicleprotected:int Height;/高度;class motorcar:public vehicle/汽车类:公有继承虚基类vehicleprotected:int SeatNum;/座位数;class motorcycle:public bicycle,public motorcar/摩托车类:公有继承自行车类和汽车类public:void Setdatab
19、icycle(int ms,int wt,int ht,int sn)bicycle:MaxSpeed=ms; bicycle:Weight=wt;/修改,指明路径Height=ht; SeatNum=sn;void Showbicycle()cout最大速度:bicycle:MaxSpeed 重量:bicycle:Weight 高度:Height 座位数:SeatNumendl; /修改,指明路径;void main()coutint类型占用字节数: sizeof(int)endl;coutvehicle占用字节数: sizeof(vehicle)endl;coutbicycle占用字节数:
20、 sizeof(bicycle)endl;coutmotorcar占用字节数: sizeof(motorcar)endl;coutmotorcycle占用字节数: sizeof(motorcycle)endl;motorcycle mt;mt.bicycle:Run();/修改,指明路径mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop();/修改,指明路径6. 以实验6中的people(人员)类为基类,派生相应的类。按任务7_4的要求编写程序,并运行。参考的运行结果: 程序及运行结果:(1) lab6_7.h:
21、People(人员)类的声明及成员函数的实现/lab6_7.h#include #include using namespace std;class Dateprivate:int yy,mm,dd;public:Date()Date(Date &d) : yy(d.yy),mm(d.mm),dd(d.dd)/增添Date() int Getyy()const return yy; int Getmm()const return mm; int Getdd()const return dd; void Setyy(int y) yy=y; void Setmm(int m) mm=m; voi
22、d Setdd(int d) dd=d; ;class Peopleprivate:char name11;/姓名,增添char number7;/编号,改为数组char sex3;/男或女,改为数组Date birthday;/出生日期char id16;/身份证号,改为数组public:People()People(People &p);People()void Getname(char na) strcpy(na,name); void Getnumber(char nu) strcpy(nu,number); void Getsex(char se)strcpy(se,sex); in
23、t Getbirthyy()const return birthday.Getyy(); int Getbirthmm()const return birthday.Getmm(); int Getbirthdd()const return birthday.Getdd(); void Getid(char d) strcpy(d,id); void Setname(char na) strcpy(name,na); void Setnumber(char nu) strcpy(number,nu); void Setsex(char se)strcpy(sex,se); void Setbi
24、rthyy(int y) birthday.Setyy(y); void Setbirthmm(int m) birthday.Setmm(m); void Setbirthdd(int d) birthday.Setdd(d); void Setid(char d) strcpy(id,d); void input();void output();People:People(People &p):birthday(p.birthday)strcpy(name,p.name);strcpy(number,p.number);strcpy(sex,p.sex);strcpy(id,p.id);i
25、nline void People:input()coutname;coutnumber;coutsex;coutymd;Setbirthyy(y); Setbirthmm(m); Setbirthdd(d);coutid;inline void People:output()cout姓名:namen编号:numberendl;cout性别:sexendl;cout出生日期:Getbirthyy()年Getbirthmm()月Getbirthdd()日endl;cout身份证号:idendl;(2) lab7_4.h:People类的派生类/lab7_4.h#include lab6_7.hc
26、lass student:virtual public People/学生类private:char classNo7;/班号public:student()student(student &st):People(st) strcpy(classNo,st.classNo); /使用类型兼容规则student()void GetclassNo(char cNo) strcpy(cNo,classNo); void SetclassNo(char *c) strcpy(classNo,c); void input() People:input(); coutclassNo; void outpu
27、t() People:output(); cout班号:classNoendl; ;class teacher:virtual public People/教师类private:char principalship11;/职务char department21;/部门public:teacher()teacher(teacher &t):People(t)strcpy(principalship,t.principalship);strcpy(department,t.department);teacher()void Getprincipalship(char *pri) strcpy(pr
28、i,principalship); void Getdepartment(char *dep) strcpy(dep,department); void Setprincipalship(char *pri) strcpy(principalship,pri); void Setdepartment(char *dep) strcpy(department,dep); void input()People:input();coutprincipalship;cout department;void output()People:output();cout职务:principalshipendl
29、;cout部门:departmentendl;class graduate:public student/研究生类private:char subject21;/专业teacher adviser;/导师public:graduate()graduate(graduate &g):student(g),adviser(g.adviser) strcpy(subject,g.subject); graduate()void GetSubject(char* sb) strcpy(sb,subject); void Getadviser(teacher &ad)char na11; adviser
30、.Getname(na); ad.Setname(na);char nb7; adviser.Getnumber(nb); ad.Setnumber(nb);char se3; adviser.Getsex(se); ad.Setsex(se);ad.Setbirthyy(adviser.Getbirthyy();ad.Setbirthmm(adviser.Getbirthmm();ad.Setbirthdd(adviser.Getbirthdd();char id016; adviser.Getid(id0); ad.Setid(id0);char pp11; adviser.Getprin
31、cipalship(pp); ad.Setprincipalship(pp);char dp21; adviser.Getdepartment(dp); ad.Setdepartment(dp);void SetSubject(char* sb) strcpy(subject,sb); void Setadviser(teacher &ad)char na11; ad.Getname(na); adviser.Setname(na);char nb7; ad.Getnumber(nb); adviser.Setnumber(nb);char se3; ad.Getsex(se); advise
32、r.Setsex(se);adviser.Setbirthyy(ad.Getbirthyy();adviser.Setbirthmm(ad.Getbirthmm();adviser.Setbirthdd(ad.Getbirthdd();char id016; ad.Getid(id0); adviser.Setid(id0);char pp11; ad.Getprincipalship(pp); adviser.Setprincipalship(pp);char dp21; ad.Getdepartment(dp); adviser.Setdepartment(dp);void input()
33、student:input();coutsubject;cout导师:endl;adviser.input();void output()student:output();cout专业:subjectendl;cout导师:endl;adviser.output();class TA:public graduate,public teacher/助教博士生类public:TA()TA(TA &ta):graduate(ta),teacher(ta)TA()void input()graduate:input();coutpp;Setprincipalship(pp);coutdp;Setdepartment(dp);void output()graduate:output();char pp11; Getprincipalship(pp);cout助教博士生的职务:ppendl;char dp21; Getdepartment(dp);cout助教博士生所在部门:dpendl;(3) lab7_4.cpp:主函数(测试)/lab7_4.cpp#include lab7_4.hvoid main()TA a;cout输入一个助教博士生的信息:endl;a.input();coutn输出一个助教博士生的信息:endl;a.output();(4) 结果专心-专注-专业