![C++语言程序设计实验答案-继承与派生(共15页)_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc2/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc21.gif)
![C++语言程序设计实验答案-继承与派生(共15页)_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc2/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc22.gif)
![C++语言程序设计实验答案-继承与派生(共15页)_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc2/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc23.gif)
![C++语言程序设计实验答案-继承与派生(共15页)_第4页](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc2/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc24.gif)
![C++语言程序设计实验答案-继承与派生(共15页)_第5页](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc2/6d14df6a-77d0-4a83-9cf3-bbdd1a965fc25.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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。1>InitializeBuildStatus:1> 正在创建“Debugcpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。1>C
5、lCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1> f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1> f:projectscppcppmain.cpp(5) : 参见“Animal”的声明1>f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 无法访问 private 成员(在“Ani
6、mal”类中声明)1> f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1> f:projectscppcppmain.cpp(5) : 参见“Animal”的声明1>1>生成失败。1>1>已用时间 00:00:03.28= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =把age改为公有变量后重新编译就可以了。程序名:lab7_1.cpp。 程序及运行结果:/lab7_1.cpp#include <iostream>using namespace std;class Animalp
7、rivate: /private时出错/public:/public和protected正确int age;class dog:public Animalpublic:void SetAge(int n) age=n; int GetAge() return age; ;void main() dog d; d.SetAge(3); cout<<"Age="<<d.GetAge()<<endl; 用private时的结果:1>- 已启动生成: 项目: cpp, 配置: Debug Win32 -1>生成启动时间为 2013-2
8、-18 11:10:35。1>InitializeBuildStatus:1> 正在创建“Debugcpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1> f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1> f:projectscppcppmain.
9、cpp(5) : 参见“Animal”的声明1>f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 无法访问 private 成员(在“Animal”类中声明)1> f:projectscppcppmain.cpp(8) : 参见“Animal:age”的声明1> f:projectscppcppmain.cpp(5) : 参见“Animal”的声明1>1>生成失败。1>1>已用时间 00:00:03.28= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =用public时
10、的结果:2.(编程)声明一个基类BaseClass,构造其派生类DerivedClass。在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。参考的运行结果: 程序及运行结果:/lab7_2.cpp#include <iostream>using namespace std;class BaseClasspublic:BaseClass() cout<<"构造了一个BaseClass类的对象."<<endl; BaseClass() cout<<"析构了一个B
11、aseClass类的对象."<<endl; private:int Number;class DeriveClass:public BaseClasspublic:DeriveClass() cout<<"构造了一个DeriveClass类的对象."<<endl; DeriveClass() cout<<"析构了一个DeriveClass类的对象."<<endl; ;void main() DeriveClass a; 3.(操作)用调试功能跟踪程序lab7_2的执行过程。观察基类和派
12、生类的构造函数和析构函数的执行情况。4.(编程)声明一个车(vehicle)虚基类。由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:lab7_3.cpp。参考的运行结果: 程序及运行结果:/lab7_3.cpp#include <iostream>using namespace std;class vehicle/车类,作为基类protected:int MaxSpeed,Weight;/最大速度,重量public:
13、void Run() cout<<"车vehicle类开始运行!"<<endl; void Stop() cout<<"车vehicle类停止运行!"<<endl; ;class bicycle:virtual public vehicle/自行车类:公有继承虚基类vehicleprotected:int Height;/高度;class motorcar:virtual public vehicle/汽车类:公有继承虚基类vehicleprotected:int SeatNum;/座位数;class mo
14、torcycle:public bicycle,public motorcar/摩托车类:公有继承自行车类和汽车类public:void Setdata(int ms,int wt,int ht,int sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=sn; ;void Show()cout<<"最大速度:"<<MaxSpeed<<" 重量:"<<Weight<<" 高度:"<<Height<<"
15、 座位数:"<<SeatNum<<endl;void main()cout<<"int类型占用字节数: "<<sizeof(int)<<endl;cout<<"vehicle占用字节数: "<<sizeof(vehicle)<<endl;cout<<"bicycle占用字节数: "<<sizeof(bicycle)<<endl;cout<<"motorcar占用字节数: &
16、quot;<<sizeof(motorcar)<<endl;cout<<"motorcycle占用字节数: "<<sizeof(motorcycle)<<endl;motorcycle mt;mt.Run();mt.Setdata(100,200,130,2);mt.Show();mt.Stop();为什么?按推算应该是:vehicle占用8字节;bicycle占用12字节;motorcar占用12字节;motorcycle占用16字节。5.(验证)把vehicle设置为非虚基类。再编译一次,此时系统报错,无法编译
17、成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。访问vehicle的成员时指明继承路径后,可以纠正二义性错误,试修改程序,然后运行。 程序的运行结果:(1) 没有指明继承路径(运行结果)将上面的程序的bicycle类和motorcar类改为非虚基类公有继承vehicle类后,编译时出现二义(ambiguous)性错误:1>- 已启动生成: 项目: cpp, 配置: Debug Win32 -1>生成启动时间为 2013-2-18 11:23:32。1>InitializeBuildStatus:1> 正在创建“Debugcpp.uns
18、uccessfulbuild”,因为已指定“AlwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(27): error C2385: 对“MaxSpeed”的访问不明确1> 可能是“MaxSpeed”(位于基“vehicle”中)1> 也可能是“MaxSpeed”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(27): error C2385: 对“Weight”的访问不明确1> 可能是“Weight”(位于基“vehicle”中)1>
19、也可能是“Weight”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(29): error C2385: 对“MaxSpeed”的访问不明确1> 可能是“MaxSpeed”(位于基“vehicle”中)1> 也可能是“MaxSpeed”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(30): error C2385: 对“Weight”的访问不明确1> 可能是“Weight”(位于基“vehicle”中)1> 也可能是“Weight”(位于基“vehicle”中)1>f:proj
20、ectscppcppmain.cpp(42): error C2385: 对“Run”的访问不明确1> 可能是“Run”(位于基“vehicle”中)1> 也可能是“Run”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(42): error C3861: “Run”: 找不到标识符1>f:projectscppcppmain.cpp(45): error C2385: 对“Stop”的访问不明确1> 可能是“Stop”(位于基“vehicle”中)1> 也可能是“Stop”(位于基“vehicle”中)1>f:pr
21、ojectscppcppmain.cpp(45): error C3861: “Stop”: 找不到标识符1>1>生成失败。1>1>已用时间 00:00:01.07= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =(2) 指明继承路径(程序及运行结果)将vehicle中数据成员和函数成员指明路径。/lab7_3.cpp#include <iostream>using namespace std;class vehicle/车类,作为基类protected:int MaxSpeed,Weight;/最大速度,重量public:void Ru
22、n() 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
23、,public motorcar/摩托车类:公有继承自行车类和汽车类public:void Setdatabicycle(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<<" 高度:"&
24、lt;<Height<<" 座位数:"<<SeatNum<<endl; /修改,指明路径;void main()cout<<"int类型占用字节数: "<<sizeof(int)<<endl;cout<<"vehicle占用字节数: "<<sizeof(vehicle)<<endl;cout<<"bicycle占用字节数: "<<sizeof(bicycle)<<en
25、dl;cout<<"motorcar占用字节数: "<<sizeof(motorcar)<<endl;cout<<"motorcycle占用字节数: "<<sizeof(motorcycle)<<endl;motorcycle mt;mt.bicycle:Run();/修改,指明路径mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop();/修改,指明路径6. 以实验6中的people(人员)类为基类,派
26、生相应的类。按任务7_4的要求编写程序,并运行。参考的运行结果: 程序及运行结果:(1) lab6_7.h:People(人员)类的声明及成员函数的实现/lab6_7.h#include <iostream>#include <cstring>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 r
27、eturn mm; int Getdd()const return dd; void Setyy(int y) yy=y; void Setmm(int m) mm=m; void 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) strcp
28、y(na,name); void Getnumber(char nu) strcpy(nu,number); void Getsex(char se)strcpy(se,sex); int 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,n
29、a); void Setnumber(char nu) strcpy(number,nu); void Setsex(char se)strcpy(sex,se); void Setbirthyy(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):bi
30、rthday(p.birthday)strcpy(name,);strcpy(number,p.number);strcpy(sex,p.sex);strcpy(id,p.id);inline void People:input()cout<<"姓名:"cin>>name;cout<<"编号:"cin>>number;cout<<"性别(男/女):"cin>>sex;cout<<"出生日期(年 月 日):"int y,m
31、,d; cin>>y>>m>>d;Setbirthyy(y); Setbirthmm(m); Setbirthdd(d);cout<<"身份证号:"cin>>id;inline void People:output()cout<<"姓名:"<<name<<"n编号:"<<number<<endl;cout<<"性别:"<<sex<<endl;cout<&l
32、t;"出生日期:"<<Getbirthyy()<<"年"<<Getbirthmm()<<"月"<<Getbirthdd()<<"日"<<endl;cout<<"身份证号:"<<id<<endl;(2) lab7_4.h:People类的派生类/lab7_4.h#include "lab6_7.h"class student:virtual public Pe
33、ople/学生类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(); cout<<"班号:" cin>>classNo; v
34、oid output() People:output(); cout<<"班号:"<<classNo<<endl; ;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);te
35、acher()void Getprincipalship(char *pri) strcpy(pri,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();cout<<"职务:" cin>>
36、;principalship;cout<<"部门:" cin>> department;void output()People:output();cout<<"职务:"<<principalship<<endl;cout<<"部门:"<<department<<endl;class graduate:public student/研究生类private:char subject21;/专业teacher adviser;/导师public:
37、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.Getname(na); ad.Setname(na);char nb7; adviser.Getnumber(nb); ad.Setnumber(nb);char se3; adviser.Gets
38、ex(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.Getprincipalship(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; a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 未来电商模式探索与展望
- 现代企业财务管理的伦理与责任
- 生产管理策略与工艺优化技术
- 灾害预防教育学校防灾减灾的必由之路
- 环保节能建筑的设计与实施案例分享
- 2024年重阳节活动策划方案-11
- 现代物流与科技融合的商业模式
- 国庆节房地产促销方案
- 2024年五年级英语上册 Unit 6 In a nature park Part A 第三课时说课稿 人教PEP
- 2024-2025学年新教材高中语文 第二单元 5 雷雨(节选)(1)说课稿 部编版必修下册
- 2025年1月浙江省高考政治试卷(含答案)
- 教体局校车安全管理培训
- 湖北省十堰市城区2024-2025学年九年级上学期期末质量检测综合物理试题(含答案)
- 导播理论知识培训班课件
- 空气能安装合同
- 中国人婚恋状况调查报告公布
- 早产儿视网膜病变
- GB 10665-1997碳化钙(电石)
- 《中小学教育惩戒规则》重点内容学习PPT课件(带内容)
- 板带生产工艺5(热连轧带钢生产)课件
- 2022年同等学力英语考试真题及详解
评论
0/150
提交评论