南京邮电大学C++实验报告二

实验涉及C++中的继承与派生概念,通过创建车基类和多个派生类,研究不同继承访问权限的影响,并观察构造与析构函数的调用顺序。同时,实验探讨了虚基类的应用,消除派生类二义性。此外,还分析了C++中的赋值兼容原则,展示了基类与派生类对象之间的赋值操作及其限制,揭示了赋值兼容的不可逆性。
摘要由CSDN通过智能技术生成

实验二: 继承与派生实验

实验题目1: 定义一个车基类,派生出自行车类和汽车类,又以自行车类和汽车类为基类共同派生出摩托车类,每个类都要定义带有参数的构造函数。对自行车类继承车基类的方式分别用privateprotectedpublic,观察基类成员在派生类中的访问属性;观察自行车类、汽车类和摩托车类对象定义时构造、析构函数的调用顺序。最后将车基类定义为虚基类再观察程序运行结果。

实验解答:

  • 根据提示进行填写完整实验指导204页代码对应位置内容如下:

( 1 )   MaxSpeed=m;                                            

( 2 )    Weight=w;                                              

( 3 )    Vehicle(m,w)                                            

( 4 )    Height=h;                                               

( 5 )    Vehicle::show();                                           

( 6 )    cout<<”It’s height is :”<<Height<<endl;                       

( 7 )    (100,10000,900)                                          

此时程序的运行结果是:

Constructing Vehicle...

Constructing Bicycle...

The vehicle is running!

Please stop running!

It's maxspeed is:100

It's weight is :10000

It's height is :900

Destructing Bicycle...

Destructing Vehicle...

  •  将继承方式改为private或protected,观察并分析程序的编译结果。

“Vehicle::Run”不可访问,因为“Bicycle”使用“private”从“Vehicle”继承

“Vehicle::Stop”不可访问,因为“Bicycle”使用“private”从“Vehicle”继承

  •  在Bicycle类下面增加Car类的定义,参考实验教材205代码,划线部分自己完成。

( 8 )    Vehicle(m,w)                                              

( 9 )      SeatNum=s;                                             

( 10 )    Vehicle::Show();                                      

( 11 )     cout<<"The number of seats is :"<<SeatNum<<endl;           

( 12 )      b (100,10000,900);                                     

( 13 )      c(300,100,200);                                        

  •  增加的第3层类MotorCycle及修改以后的main( )函数,代码参见实验教材206页。

( 14 )      Bicycle(h),Car(s)                                       

( 15 )      mc(280,3000,120,2) ;                                                   

⑤ 将Vehicle声明为虚基类以消除二义性,具体要在上面的基础上修改3个地方。

·  将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) 的初始化列表中增加对虚基类构造函数的调用。

( 16 )      Bicycle(h),Car(s) ,Vehicle(h,m)

实验题目2):定义Base类及它的公有派生类Derived类,两个类中均定义带参数的构造函数,基类中定义函数Show( ),派生类中也定义一个同名的Show( ),二者输出内容有所区别。主函数中定义基类的对象、指针、引用,也定义派生类的对象。

① 对赋值兼容的4种情况作测试,对每行的输出结果进行观察,理解赋值兼容何时调用基类的成员函数,什么情况下才会调用派生类的成员函数。

② 在主函数的return 0;语句前增加4条语句,观察并记下编译时的报错信息,理解赋值兼容的不可逆性。

实验解答:

  •  按提示将程序填写完整,代码参见实验教材206-207页,对应位置内容是:

(1 )     b1(2); 

(2 )      d1(4); 

(3 )     b1=d1; 

(4 )     &b2=d1;

(5 )    *b3=&d1; 

(6 )    new Derived(5); 

程序的运行结果是:

基类对象 b1.show():

i in Base is:2

基类b1=d1, b1.show():

i in Base is:4

派生类对象 d1.show():

i in Derived is:4

引用b2=d1,b2.show():

i in Base is:4

基类指针b3=&d1,b3->show():

i in Base is:4

基类指针b4=d4,b4->show():

i in Base is:5

派生类指针d4 d4->show():

i in Derived is:5

  •  在主函数的return 0;语句前增加4条语句:

Derived d5=b1;

          Derived &d6=b1;

          Derived *d7=&b1;

    d7=b3;

观察并记下编译时的报错信息,理解赋值兼容的不可逆性。

“初始化”: 无法从“Base”转换为“Derived”

无构造函数可以接受源类型,或构造函数重载决策不明确

“初始化”: 无法从“Base”转换为“Derived &”

“初始化”: 无法从“Base *”转换为“Derived *”

从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast

“=”: 无法从“Base *”转换为“Derived *”

从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookie爱吃小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值