




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验5(2) 类的继承与派生参考答案一、实验目的与实验要求(1)掌握单继承和多重继承下派生类的定义方法,理解基类成员在不同的继承方式下不同的访问属性。(2)正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时构造函数、析构函数的调用次序。(3)理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的调用顺序。(4)理解赋值兼容的相关使用方法。二、实验内容题目1:定义一个车基类,派生出自行车类和汽车类,并以自行车类和汽车类为基类共同派生出摩托车类,每个类都要定义带有参数的构造函数。自行车类分别使用private、protected、public三种方式来继承车基类,观察基类成员在派生类中的访问属性;观察自行车类、汽车类和摩托车类对象定义时构造、析构函数的调用顺序。最后将车基类定义为虚基类再观察程序运行结果。题目的具体要求如下。 定义基类Vehicle,它具有两个保护成员变量:MaxSpeed、Weight,有3个公有的成员函数:Run( )、Stop( )、Show( ),以及带参数的构造函数、析构函数;再定义一个从Vehicle公有继承的Bicycle类,增加保护属性的成员变量Height,定义Bicycle类的构造函数、析构函数,改造Show函数,用于输出本类中的完整信息。main( )函数中定义Bicycle类对象,观察构造函数和析构函数的执行顺序,以及各成员函数的调用。使用跟踪的方法观察程序运行的每一步究竟调用的是哪一个函数。 在上一步基础上,将继承方式分别修改为protected和private,再重新编译,观察这时的报错信息并进行分析。 将Bicycle类的继承方式恢复为public,代码回到 的状态,再在Bicycle类下面增加一个第二层汽车类Car的定义,Car也是公有继承基类Vehicle,其中增加了一个保护成员变量SeatNum,表示汽车有几个座位,其定义方式与类Bicycle类似。主函数中定义该类对象,观察运行结果。 在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有方式继承了第二层的Bicycle和Car类。定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show( ),输出所有四个成员变量的信息。主函数中只定义类MotorCycle的对象并调用相应的函数,代码请参考实验指导1的。程序进行编译,会产生4个错误、8个警告,因为存在二义性问题,在同名成员前增加“基类名:”以消除二义性直到程序正确,观察运行结果。 再将代码恢复至上一步未修改前,即存在4个错误、8个警告的状态,再作一定的修改,将Vehicle声明为虚基类以消除二义性,同时修改第三层类的构造函数,其余代码不变,具体请参考实验指导1的。观察运行结果,理解此时构造函数、析构函数的调用顺序及用虚基类消除二义性的原理。参考程序如下:#include using namespace std;class Vehicle /定义基类protected:int MaxSpeed; /最大速度int Weight; /重量public:Vehicle(int m, int w) /初始化成员变量的值 MaxSpeed=m; Weight=w; cout Constructing Vehicle.n;Vehicle( )cout Destructing Vehicle.n;void Run( )cout The vehicle is running!n;void Stop( )cout Please stop running!n;void Show( )cout Its maxspeed is: MaxSpeed endl;cout Its weight is: Weight endl;class Bicycle: public Vehicle /定义派生类,公有继承protected:int Height; /高度,单位:厘米public:Bicycle(int m, int w, int h):Vehicle(m,w) /调用基类构造函数Height=h; /为本类中新增成员提供初始值cout Constructing Bicycle.n;Bicycle( )cout Destructing Bycycle.n;void Show( ) /改造基类的Show函数Vehicle:Show();/调用基类Show输出MaxSpeed和Weight值 coutIts Height is:Heightendl; /输出本类高度;int main( ) Bicycle b(120,2,4);/定义派生类对象b.Run ( ); /观察构造、析构函数调用顺序b.Stop( );b.Show ( );return 0;运行结果:Constructing Vehicle.Constructing Bicycle.The vehicle is running!Please stop running!Its maxspeed is:120Its weight is:2Its Height is:4Destructing Bycycle.Destructing Vehicle.Press any key to continue 在上一步基础上,将继承方式分别修改为protected和private,再重新编译,观察这时的报错信息并进行分析。答:继承方式是private或protected后,main函数中的语句:b.Run ( ); b.Stop( );等均不能通过编译,因为基类中的成员函数都是派生类的私有的或保护的成员函数,类外用派生类对象都不能再调用。 将Bicycle类的继承方式恢复为public,代码回到 的状态,再在Bicycle类下面增加一个第二层汽车类Car的定义,Car也是公有继承基类Vehicle,其中增加了一个保护成员变量SeatNum,表示汽车有几个座位,其定义方式与类Bicycle类似。主函数中定义该类对象,观察运行结果。指导: 在Bicycle类下面增加Car类的定义,参考以下代码,划线部分自己完成。class Car: public Vehicle /定义派生类Car,公有继承public:int SeatNum; /座位数Car (int m, int w, int s) : (8) /调用基类构造函数 (9) /为本类中新增成员提供初始值cout Constructing Car.n;Car( )cout Destructing Car.n; void Show( ) /改造基类的Show函数 (10) /调用基类Show输出MaxSpeed和Weight值 (11) /输出本类座位数;在主函数增加Car类对象的定义并调用相应函数,主函数代码如下。int main( )Bicycle (12) /定义自行车类对象b.Run( );b.Stop( );b.Show ( );Car (13) /定义汽车类对象c.Run ( );c.Stop( );c.Show ( );return 0;参考程序如下:class Car: public Vehicle /定义派生类Car,公有继承 protected:int SeatNum; /座位数 public:Car (int m, int w, int s) : Vehicle(m,w)/调用基类构造函数SeatNum=s; /为本类中新增成员提供初始值cout Constructing Car.n;Car( )cout Destructing Car.n; void Show( ) /改造基类的Show函数Vehicle:Show();/调用基类Show输出MaxSpeed和Weight值coutIts SeatNum is:SeatNumendl; /输出本类座位数;int main( )Bicycle b(50,2,400); /定义自行车类对象b.Run( );b.Stop( );b.Show ( );Car c(120,2000,5); /定义汽车类对象c.Run ( );c.Stop( );c.Show ( );return 0;运行结果为:Constructing Vehicle.Constructing Bicycle.The vehicle is running!Please stop running!Its maxspeed is:50Its weight is:2Its Height is:400Constructing Vehicle.Constructing Car.The vehicle is running!Please stop running!Its maxspeed is:120Its weight is:2000Its SeatNum is:5Destructing Car.Destructing Vehicle.Destructing Bycycle.Destructing Vehicle.Press any key to continue 在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有方式继承了第二层的Bicycle和Car类。定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show( ),输出所有四个成员变量的信息。主函数中只定义类MotorCycle的对象并调用相应的函数,代码请参考实验指导1的。程序进行编译,会产生4个错误、8个警告,因为存在二义性问题,在同名成员前增加“基类名:”以消除二义性直到程序正确,观察运行结果。指导:增加的第3层类MotorCycle及修改以后的main( )函数。class MotorCycle: public Bicycle, public Car /第3层类,从第2层两个类公有继承public:MotorCycle(int m, int w, int h, int s): (14) /调用两基类构造函数cout Constructing MotorCycle.n;MotorCycle( )cout Destructing MotorCycle.n;void Show( ) /输出4个成员变量的信息,需消除二义性cout Its maxspeed is: MaxSpeed endl; /错误cout Its weight is: Weight endl; /错误cout Its height is: Height endl;cout Its seatnum is: SeatNum endl;int main( )MotorCycle (15) /定义摩托车类对象mc.Run ( ); /错误mc.Stop( ); /错误mc.Show ( );return 0;程序为:class MotorCycle: public Bicycle, public Car /第3层类,从第2层两个类公有继承public:MotorCycle(int m, int w, int h, int s): Bicycle(m,w,h),Car(m,w,s)/调用两基类构造函数cout Constructing MotorCycle.n;MotorCycle( )cout Destructing MotorCycle.n;void Show( ) /输出4个成员变量的信息,需消除二义性cout Its maxspeed is: MaxSpeed endl; /错误cout Its weight is: Weight endl; /错误cout Its height is: Height endl;cout Its seatnum is: SeatNum endl;int main( )MotorCycle mc(120,1000,2,2);/定义摩托车类对象mc.Run ( ); /错误mc.Stop( ); /错误mc.Show ( );return 0;编译出错:E:2012-2013(2)C+教学教案Text1.cpp(113) : error C2385: MotorCycle:MaxSpeed is ambiguousE:2012-2013(2)C+教学教案Text1.cpp(113) : warning C4385: could be the MaxSpeed in base Vehicle of base Bicycle of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(113) : warning C4385: or the MaxSpeed in base Vehicle of base Car of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(114) : error C2385: MotorCycle:Weight is ambiguousE:2012-2013(2)C+教学教案Text1.cpp(114) : warning C4385: could be the Weight in base Vehicle of base Bicycle of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(114) : warning C4385: or the Weight in base Vehicle of base Car of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(125) : error C2385: MotorCycle:Run is ambiguousE:2012-2013(2)C+教学教案Text1.cpp(125) : warning C4385: could be the Run in base Vehicle of base Bicycle of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(125) : warning C4385: or the Run in base Vehicle of base Car of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(126) : error C2385: MotorCycle:Stop is ambiguousE:2012-2013(2)C+教学教案Text1.cpp(126) : warning C4385: could be the Stop in base Vehicle of base Bicycle of class MotorCycleE:2012-2013(2)C+教学教案Text1.cpp(126) : warning C4385: or the Stop in base Vehicle of base Car of class MotorCycle执行 cl.exe 时出错.即输出MaxSpeed、Weigh和调用函数Run()和Stop()函数时出现二义性问题。修改程序中主要是为数据成员和成员函数限定其所属类即可。程序为:class MotorCycle: public Bicycle, public Car /第3层类,从第2层两个类公有继承public:MotorCycle(int m, int w, int h, int s): Bicycle(m,w,h),Car(m,w,s)/调用两基类构造函数cout Constructing MotorCycle.n;MotorCycle( )cout Destructing MotorCycle.n;void Show( ) /输出4个成员变量的信息,需消除二义性cout Its maxspeed is: Bicycle:MaxSpeed endl; /修改后cout Its weight is: Car:Weight endl; /修改后cout Its height is: Height endl;cout Its seatnum is: SeatNum endl;int main( )MotorCycle mc(120,1000,2,2);/定义摩托车类对象mc.Bicycle:Run ( ); /修改后mc.Bicycle:Stop( ); /修改后mc.Show ( );return 0;运行结果:Constructing Vehicle.Constructing Bicycle.Constructing Vehicle.Constructing Car.Constructing MotorCycle.The vehicle is running!Please stop running!Its maxspeed is:120Its weight is:1000Its height is:2Its seatnum is:2Destructing MotorCycle.Destructing Car.Destructing Vehicle.Destructing Bycycle.Destructing Vehicle.Press any key to continue 再将代码恢复至上一步未修改前,即存在4个错误、8个警告的状态,再作一定的修改,将Vehicle声明为虚基类以消除二义性,同时修改第三层类的构造函数,其余代码不变,具体请参考实验指导1的。观察运行结果,理解此时构造函数、析构函数的调用顺序及用虚基类消除二义性的原理。指导:将Vehicle声明为虚基类以消除二义性,具体要在上面的基础上修改以下地方。 将class Bicycle: public Vehicle 修改为 class Bicycle: virtual public Vehicle。 将class Car: public Vehicle 修改为 class Car: virtual public Vehicle。 在第3层类的构造函数MotorCycle(int m,int w,int h,int s): (16) 的初始化列表中增加对虚基类构造函数的调用。 原来注释出错的地方将类名的限制去掉,恢复原样。如:cout Its maxspeed is: Bicycle:MaxSpeed endl; /错误恢复为:cout Its maxspeed is: MaxSpeed endl;按题意,将Vehicle声明为虚基类以消除二义性,具体修改; 将class Bicycle: public Vehicle 修改为 class Bicycle: virtual public Vehicle。 将class Car: public Vehicle 修改为 class Car: virtual public Vehicle。程序修改为:class MotorCycle: public Bicycle, public Car /第3层类,从第2层两个类公有继承public:MotorCycle(int m, int w, int h, int s): Vehicle(m,w),Bicycle(m,w,h),Car(m,w,s)/调用两基类构造函数cout Constructing MotorCycle.n;MotorCycle( )cout Destructing MotorCycle.n;void Show( ) /输出4个成员变量的信息,需消除二义性cout Its maxspeed is: MaxSpeed endl; /正确cout Its weight is: Weight endl; /正确cout Its height is: Height endl;cout Its seatnum is: SeatNum endl;int main( )MotorCycle mc(120,1000,2,2);/定义摩托车类对象mc.Run ( ); /正确mc.Stop( ); /正确 mc.Show ( ); return 0;运行结果为:Constructing Vehicle.Constructing Bicycle.Constructing Car.Constructing MotorCycle.The vehicle is running!Please stop running!Its maxspeed is:120Its weight is:1000Its height is:2Its seatnum is:2Destructing MotorCycle.Destructing Car.Destructing Bycycle.Destructing Vehicle.Press any key to continue题目2:定义Base类及它的公有派生类Derived类,两个类中均定义带参数的构造函数,基类中定义函数Show( ),派生类中也定义一个同名的Show( ),二者输出内容有所区别。主函数中定义基类的对象、指针、引用,也定义派生类的对象。( 中6个空各0.3分,分析0.2分) 对赋值兼容的4种情况作测试,对每行的输出结果进行观察,理解赋值兼容何时调用基类的成员函数,什么情况下才会调用派生类的成员函数。 在主函数的return 0;语句前增加4条语句,观察并记下编译时的报错信息,理解赋值兼容的不可逆性。程序如下:#include using namespace std;class Basepublic:int i;Base(int x): i(x) void show( )cout i in Base is: i endl; ;class Derived: public Basepublic:Derived(int x): Base(x) void show( )cout i in Derived is: i endl; ; int main( )Base b1(1);/定义基类对象b1cout 基类对象 b1.show( ):n; b1.show( );Derived d1(2);/定义派生类对象d1b1=d1; /用派生类对象给基类对象赋值cout 基类b1=d1, b1.show( ):n; b1.show( );cout 派生类对象 d1.show( ):n; d1.show( );Base & b2=d1; /用派生类对象来初始化基类引用cout 引用b2=d1, b2.show( ):n; b2.show( );Base * b3=&d1; /派生类对象的地址赋给指向基类的指针cout show( ):n;b3-show( );Derived *d4=new Derived(3); /定义派生类指针并生成新对象Base *b4 = d4 ; /派生类指针赋给指向基类的指针cout show( ):n;b4-show( ); cout show( ):n;d4-show( );delete d4;return 0;运行结果:基类对象 b1.show( ):i in Base is: 1基类b1=d1, b1.show( ):i in Base is: 2派生类对象 d1.show( ):i in Derived is: 2引用b2=d1, b2.show( ):i in Base is: 2基类指针b3=&d1, b3-show( ):i in Base is: 2基类指针b4 = d4, b4-show( ):i in Base is: 3派生类指针d4, d4-show( ):i in Derived is: 3Press any key to continue 对赋值兼容的4种情况作测试,对每行的输出结果进行观察,理解赋值兼容何时调用基类的成员函数,什么情况下才会调用派生类的成员函数。答:4种情况:基类对象 = 公有派生类对象b1=d1; b1.show( );调用的是基类Base的成员函数show;指向基类对象的指针 = 公有派生类对象的地址Base * b3=&d1; b3-show( ); 调用的是基类Base的成员函数show;指向基类对象的指针 = 指向公有派生类对象的指针Base *b4 = d4 ; b4-show( ); 调用的是基类Base的成员函数show;基类的引用 = 公有派生类对象,即派生类对象可以初始化基类的引用。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 零星维修协议书范文
- 云南省畹町市2025年上半年事业单位公开遴选试题含答案分析
- 河北省宽城满族自治县2025年上半年公开招聘村务工作者试题含答案分析
- 2025版汽车维修企业安全教育培训合同
- 2025爆破工程爆破设计与施工合同
- 2025年新春商铺转租合同范本及注意事项
- 2025年度电力施工环境保护合同范本
- 2025版智能投影仪采购与教育培训服务合同
- 2025版商铺认筹协议书(城市更新)
- 2025版水电设施维修保养劳务合同服务标准
- 医院培训课件:《静脉血栓栓塞症(VTE)专题培训》
- GB/T 43933-2024金属矿土地复垦与生态修复技术规范
- 锅炉安全培训教材(大全)
- 医废管理与处置的实际操作手册与指南
- 义齿工厂开设策划方案
- (完整版)中医适宜技术课件
- 患者隐私保护培训课件1
- 中国老年危重患者营养支持治疗指南(2023版)解读
- 自媒体运营计划
- 愚公移山英文 -中国故事英文版课件
- 文明施工扬尘治理专项方案
评论
0/150
提交评论