


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验07继承与派生(4学时)(第7章 继承与派生)一、实验目的(1) 学习声明和使用类的继承关系,声明派生类。(2) 熟悉不同继承方式下对基类成员的访问控制。(3) 学习利用虚基类解决二义性问题。二、实验任务7_1声明一个基类 Animal。有私有整型成员变量 age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age 赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。7_2声明一个基类BaseClass有整型成员变量 Number,构造其派生类 DerivedClass,观察构造函数和析构函数的执 行情况。7_3声明一个车(vehicle基类。
2、具有MaxSpeed> Weight等成员变量,Run> Stop等成员函数,由此派生出自行车 (bicycle) 类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位 数(SeatNum)等属性。从 bicycle和 motorcar派生出摩托车(motorcycle)类,在继承过程中, 注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。7_4以实验6中的People (人员)类为基类。派生出student (学生)类,添加属性:班号char classNo7;派生出
3、teacher (教师)类,添加属性:职务 char principalship11、部门char departmental。从student类中派生出 graduate (研究生)类,添加属性:专业char subject21、导师teacher adviser ;从graduate类和teacher类派生出TA (助教生)类,注意虚基类的使用。重载相应的 成员函数,测试这些类。类之间的关系如图7-1所示。图7-1类图三、实验步骤1.(编程)声明基类 Animal,成员变量age声明为私有的。构造派生类dog,在其成员函数 SetAge(int n)中直接对age赋值时,会出现类似以下的错误
4、提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)用private 时的结果:1> 已启动生成:项目:cpp, 配置:Debug Win321>生成启动时间为 2013-2-18 11:10:35。1>l nitializeBuildStatus:1> 正在创建"Debug'cpp.unsuccessfulbuild”,因为已指定"AlwaysCreate ”。1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(1
5、3):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成员(在"Animal ”类中声明)1>f:projectscppcppmain.cp
6、p(8):参见"Animal:age ” 的声明1>f:projectscppcppmain.cpp(5):参见"Animal ” 的声明1>1>生成失败。1>1>已用时间 00:00:03.28=生成:成功0 个,失败1个,最新 0 个,跳过0 个=把age改为公有变量后重新编译就可以了。程序名:Iab7_1.cpp。程序及运行结果:lab7_1.cpp#in clude <iostream>using namespace std;class An imalprivate : /private 时出错public:public禾口
7、 protected 正确int age;;class dog: public Animalpublic :void SetAge( int n) age=n; int GetAge() return age; ;void mai n() dog d; d.SetAge(3); cout<< "Age=" <<d.GetAge()<<endl; 用private 时的结果:1> 已启动生成:项目:cpp, 配置:Debug Win321>生成启动时间为 2013-2-18 11:10:35。1>l nitializeBu
8、ildStatus:1> 正在创建"Debug'cpp.unsuccessfulbuild ”,因为已指定"AlwaysCreate ”。 1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(13):error C2248: “Animal:age ”: 无法访问 private成员(在"Animal ”类中声明)1>f:projectscppcppmain.cpp(8):参见"Animal:age ” 的声明1>f:projectscppcppmain.cpp
9、(5):参见"Animai ” 的声明1>f:projectscppcppmain.cpp(14):error C2248: “Animal:age ”:无法访问 private成员(在"Animal ”类中声明)1>f:projectscppcppmain.cpp(8):参见"Animal:age ” 的声明1>f:projectscppcppmain.cpp(5):参见"Animai ” 的声明1>1>生成失败。1>1>已用时间 00:00:03.28= 生成:成功0个,失败 1个,最新 0个,跳过 0个=用
10、public时的结果:2.(编程)声明一个基类 BaseClass构造其派生类 DerivedClass在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:Iab7_2.cpp。参考的运行结果:程序及运行结果:lab7_2.cpp#in elude <iostream>using namespace std;class BaseClasspublic :BaseClass() cout<< "构造了一个 BaseClass 类的对象."<<endl; BaseClass() cout<<&q
11、uot;析构了一个 BaseClass 类的对象."<<endl; private :int Number;class DeriveClass: public BaseClasspublic :DeriveClass() cout<< "构造了一个 DeriveClass 类的对象."<<endl; DeriveClass() cout<<"析构了一个 DeriveClass 类的对象."<<endl; ;void mai n() DeriveClass a; 3.(操作)用调试功能跟
12、踪程序Iab7_2的执行过程观察基类和派生类的构造函数和析构函数的执行情况。4.(编程)声明一个车(vehicle虚基类。由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从 bicycle和motorcar派生出摩托车(motorcycle)类,在 main()函数中测试这个类。程序名: lab7_3.cpp。参考的运行结果:程序及运行结果:lab7_3.cpp#in elude <iostream>using namespace std;class vehicle /车类,作为基类protected :int MaxSpeed
13、,Weight; / 最大速度,重量public:void Run() cout<< "车 vehicle 类开始运行!"<<endl; void Stop() cout<< "车 vehicle 类停止运行!"<<endl; ;class bicycle: virtual public vehicle / 自行车类:公有继承虚基类vehicleprotected :int Height; / 高度;class motorcar: virtual public vehicle /汽车类:公有继承虚基类veh
14、icle protected :int SeatNum; / 座位数;class motorcycle:public bicycle, public motorcar /摩托车类:公有继承自行车类和汽车类 public:void Setdata( int ms, int wt, int ht, int sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=s n; ;void Show()cout<< "最大速度:"<<MaxSpeed<< " 重量:"<<Weigh
15、t<< " 高度:"<<Height<< " 座位数:"<<SeatNum<<endl;void mai n()cout<< "int 类型占用字节数:"<< sizeof(int)<<endl;cout<< "vehicle 占用字节数:"<< sizeof (vehicle)<<endl;cout<< "bicycle 占用字节数:"<<
16、 sizeof (bicycle)<<endl;cout<< "motorcar 占用字节数:"<< sizeof (motorcar)<<endl;cout<< "motorcycle 占用字节数 :"<< sizeof (motorcycle)<<endl;motorcycle mt;mt.Ru n();mt.Setdata(100,200,130,2);mt.Show();mt.Stop();为什么?按推算应该是:vehicle占用8字节;bicycle占用12字节
17、;motorcar占用12字节;motorcycle 占用 16 字节。5.(验证)把vehicle设置为非虚基类。再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。访问vehicle的成员时指明继承路径后,可以纠正二义性错误,试修改程序,然后运行。程序的运行结果:(1)没有指明继承路径(运行结果)将上面的程序的 bicycle类和motorcar类改为非虚基类公有继承vehicle类后,编译时出现二义(ambiguous)性错误:1> 已启动生成:项目:cpp, 配置:Debug Win321>生成启动时间为 2
18、013-2-18 11:23:32。1>l nitializeBuildStatus:1> 正在创建"Debug'cpp.unsuccessfulbuild”,因为已指定"AlwaysCreate ”。1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(27): error C2385:对"MaxSpeed 的访问不明确1>可能是"MaxSpeed (位于基"vehicle ”中)1>也可能是"MaxSpeed'(位于基&quo
19、t;vehicle ”中)1>f:projectscppcppmain.cpp(27): error C2385:对"Weight ” 的访问不明确1>可能是"Weight ” (位于基"vehicle ”中)1>也可能是“ Weight ”(位于基“1>f:projectscppcppma in. cpp(29): error C2385: 1>可能是"MaxSpeed (位于基"1>也可能是"MaxSpeed'(位于基1>f:projectscppcppma in. cpp(30)
20、: error C2385:vehicle ”中)对"MaxSpeed"的访问不明确vehicle ”中)“ vehicle ”中)对"Weight ”的访问不明确1>可能是"Weight ” (位于基"vehicle ”中)1>也可能是"Weight"(位于基"vehicle ”中)1>f:projectscppcppmain.cpp(42): error C2385:对"Rur” 的访问不明确1>可能是"Rur”(位于基"vehicle ”中)1>也可
21、能是"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:projectscppcppmain.cpp(45): error C3861
22、:“ Stop ” :找不到标识符 1> 1生成失败。11已用时间 00:00:01.07=生成:成功0 个,失败1个,最新 0 个,跳过0 个=(2)指明继承路径(程序及运行结果)将vehicle中数据成员和函数成员指明路径。lab7_3.cpp#in clude <iostream>using namespace std;class vehicle /车类,作为基类protected :int MaxSpeed,Weight; / 最大速度,重量public :void Run() cout<< "车 vehicle 类开始运行!"<
23、<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 /摩托车类:公有继承自行车类
24、和汽车类public :void Setdatabicycle( int ms, int wt, int ht, int sn)bicycle:MaxSpeed=ms; bicycle:Weight=wt; / 修改,指明路径Height=ht; SeatNum=s n;void Showbicycle()cout<< "最大速度:"<<bicycle:MaxSpeed<< "重量:"<<bicycle:Weight<< " 高度:"<<Height<<
25、; " 座位数:"<<SeatNum<<endl; / 修改,指明路径;void mai n()cout<< "int 类型占用字节数:"<< sizeof(int)<<endl;cout<< "vehicle 占用字节数:"<< sizeof (vehicle)<<endl;cout<< "bicycle 占用字节数:"<< sizeof (bicycle)<<endl;cout&l
26、t;< "motorcar 占用字节数:"<< sizeof (motorcar)<<endl;cout<< "motorcycle 占用字节数 :"<< sizeof (motorcycle)<<endl;motorcycle mt;mt.bicycle:Ru n();/ 修改,指明路径mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop(); / 修改,指明路径6.以实验6中的people (人员)类为基类
27、,派生相应的类按任务7_4的要求编写程序,并运行。参考的运行结果:芭 CzflHDOTSdyst0B32»d< ftxail|QI 亠、10 1:1985日01儿年伽助山eiFle学丨 ';1965X)- 日:学系a- I 17壽所 :授塞生3TT 1 20-:今日证:入茗号别生份口亚师名号别生份务门書姓编性岀身班专莓编性岀|>职番助艸山Bll 1:lle学武Bl学E- 笳最- 壽所继I :拦.牛匕左_锂 砥101書号20:数王士士意一日UE-1 日证:出名号别善口並师名号别告音程序及运行结果:(1) Iab6_7.h : People (人员)类的声明及成员函数
28、的实现lab6_7.h#in elude <iostream>#in elude <cstri ng>using namespaee 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; vo
29、id Setmm( int m) mm=m; void Setdd( int d) dd=d; ;class Peopleprivate :char n ame11;/ 姓名,增添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); v
30、oid Getsex( char se)strcpy(se,sex); int Getbirthyy() con st retur n birthday.Getyy(); int Getbirthmm() con st return birthday.Getmm(); int Getbirthdd() con st return birthday.Getdd(); void Getid( char d) strcpy(d,id); void Setname( char na) strcpy(name,na); void Setnumber( char nu) strcpy(number,nu)
31、; 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 in put();void output();People:People(People &p):birthday(p.birthday)strcpy( name,p. name)
32、;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,d; cin»y> >m»d;Se
33、tbirthyy(y); Setbirthmm(m); Setbirthdd(d);cout<< "身份证号:"cin>>id;inline void People:output()cout<< "姓名:"<<name<< "n 编号:"<<number<<endl;cout<< "性别:"<<sex<<endl;cout<< "出生日期:"<<Getb
34、irthyy()<<"年”<<Getbirthmm()<< "月"<<Getbirthdd()<< "日"<<endl;cout<< "身份证号:"<<id<<endl;(2) Iab7_4.h : People类的派生类lab7_4.h#i nclude "lab6_7.h"class student: virtual public People / 学生类private :char classN
35、o7; / 班号public :/使用类型兼容规则stude nt()stude nt(stude nt &st):People(st) strcpy(classNo,st.classNo); stude nt()void GetclassNo( char cNo) strcpy(cNo,classNo); void SetclassNo( char *c) strcpy(classNo,c); void in put() People:i nput(); cout<<"班号:"cin >>classNo; void output() Peo
36、ple:output(); cout<<"班号:"<<classNo<<e ndl; ;class teacher: virtual public People / 教师类private :char prin cipalship11; / 职务char departme nt21; / 部门public :teacher()teacher(teacher &t):People(t)strcpy(pri ncipalship,t.pri ncipalship); strcpy(departme nt,t.departme nt);t
37、eacher()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 in put() People:i nput();cout<< "职务:"ci
38、n>>principalship;cout<< "部门:”;cin>> department;void output()People:output();cout<< "职务:"<<principalship<<endl;cout<< "部门:"<<department<<endl;;class graduate: public student / 研究生类private :char subject21; / 专业teacher advis
39、er; / 导师public :graduate()graduate(graduate &g):stude nt(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);ch
40、ar 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 .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 n a11; ad.Get name (n a); adviser.Set name( na);char n b7; ad.Get nu mber( nb); adviser.Set nu mber( nb);char se3; ad.Getsex(se); adviser .Setsex(se);adviser .Setbirthyy(a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 佛山科学技术学院《园林制图》2023-2024学年第二学期期末试卷
- 柳州城市职业学院《食品加工与保藏原理实验》2023-2024学年第二学期期末试卷
- 广东外语外贸大学《语文教学设计艺术》2023-2024学年第二学期期末试卷
- 中央司法警官学院《普通话语言与艺术》2023-2024学年第二学期期末试卷
- 中国地质大学(北京)《科技文献阅读与写作》2023-2024学年第二学期期末试卷
- 星海音乐学院《工程招投标与概预算》2023-2024学年第二学期期末试卷
- 辽宁轻工职业学院《“智者生存”-现代灾难救援理念与技术》2023-2024学年第二学期期末试卷
- 成都东软学院《软件系统分析与设计》2023-2024学年第二学期期末试卷
- 喀什职业技术学院《建筑材料》2023-2024学年第二学期期末试卷
- 重庆对外经贸学院《当代建筑》2023-2024学年第二学期期末试卷
- 有机肥原材料采购合同范本
- 2024辽宁省各市农村电力服务限公司联合招聘220人重点基础提升难、易点模拟试题(共500题)附带答案详解
- 2024新版挂名法人免责协议完整版
- (正式版)JTT 1497-2024 公路桥梁塔柱施工平台及通道安全技术要求
- python程序设计-说课
- MOOC 一生的健康锻炼-西南交通大学 中国大学慕课答案
- 中国古典文学中的生态意识
- 牛顿第三定律说课市公开课一等奖省赛课微课金奖课件
- 示范村建设项目勘察设计后续服务的安排及保证措施
- AI工业质检简介演示
- 2023年10月自考试题04737C++程序设计
评论
0/150
提交评论