C++第10/11周项目 继承与派生 【项目5 - 摩托车继承自行车和机动车】(复习新版)

/*
 *copyright(c) 2016,烟台大学计算机学院
 *All rights reserved
 *文件名称:test.cpp
 *作者:谭泽纯
 *版本:v6.0

 *

在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承,如图所示。 
  这里写图片描述 
  下载可执行文件链接motorcar.exe
(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码; 
(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。 
(3)运行程序,享受开摩托的过程。(可以在博客中下载可执行文件,先开摩托,再编程。不必申请驾照,这个摩托车很安全。) 
(4)在报告中,请用自己的话写清楚使用虚基类解决什么问题?

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <iostream></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<conio.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <windows.h></span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">enum</span> vehicleStaus {rest, running};  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//车辆状态:泊车、行进</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> vehicle <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//车辆类</span>
{
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span>:
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxSpeed;       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//最大车速</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> currentSpeed;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//当前速度</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> weight;         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//车重</span>
    vehicleStaus status; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//rest-泊车状态;running-行进状态</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
    vehicle(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxS, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//构造函数,初始时,当前速度总为0且处在停车状态</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> start();  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//由rest状态到running, 初速为1</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> stop(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//由running状态到rest, 当前速度小于5时,才允许停车</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> speed_up();  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加速,调用1次,速度加1</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> slow_down(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//减速,调用1次,速度减1,速度为0时,停车</span>
};

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> bicycle :_____(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)_________<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//(1)自行车类的虚基类为车辆类</span>
{
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span>:
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span> height; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//车高</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
    bicycle(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.7</span>);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定义构造函数</span>
};

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> motorcar : ______(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)__________<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//(2)机动车类的虚基类也为车辆类</span>
{
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span>:
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> seatNum; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//座位数</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> passengerNum; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//乘客人数</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
    motorcar(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1500</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> s=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> p=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定义构造函数</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> addPassenger(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> p=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//增加搭载的乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。只有车停稳后才能上下客。</span>
};

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> motorcycle: ______(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)_________ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//(3)摩托车类的基类为自行车类和机动车类</span>
{
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:    
    motorcycle(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxS=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">90</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> s=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> p=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.7</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定义构造函数</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> show(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//显示摩托车的运行状态</span>
};

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main( )
{
    motorcycle m;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> end=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (!end)
    {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"请操作:1-启动  2-加速  3-减速  4-有人上车  5-有人下车  6-停车 0-结束"</span><<endl;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> keydown= _getch(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//_getch()返回键盘上读取的字符</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span>(keydown)
        {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'1'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是1-启动\t"</span>;
            m.start();
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'2'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是2-加速\t"</span>;
            m.speed_up();
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'3'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是3-减速\t"</span>;
            m.slow_down();
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'4'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是4-有人上车\t"</span>;
            m.addPassenger();
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'5'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是5-有人下车\t"</span>;
            m.addPassenger(-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'6'</span>:
            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"选中的操作是6-停车\t"</span>;
            m.stop();
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'0'</span>:
            end=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        }
        m.show();
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<endl;
        Sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">200</span>);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//要包含头文件<windows.h></span>
    }
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}</code>



  1. #include <iostream>  
  2. #include<conio.h>  
  3. #include <windows.h>  
  4. using namespace std;  
  5. enum VehicleStaus {rest, running};  //车辆状态:泊车、行进  
  6. class Vehicle //车辆类  
  7. {  
  8. protected:  
  9.     int maxSpeed;       //最大车速  
  10.     int currentSpeed;   //当前速度  
  11.     int weight;         //车重  
  12.     VehicleStaus status; //rest-泊车状态;running-行进状态  
  13. public:  
  14.     Vehicle(int maxS, int w); //构造函数,初始时,当前速度总为0且处在停车状态  
  15.     void start();  //由rest状态到running, 初速为1  
  16.     void stop(); //由running状态到rest, 当前速度小于5时,才允许停车  
  17.     void speed_up();  //加速,调用1次,速度加1  
  18.     void slow_down(); //减速,调用1次,速度减1,速度为0时,停车  
  19. };  
  20.   

  21. Vehicle::Vehicle(int maxS, int w):maxSpeed(maxS), currentSpeed(0),weight(w), status(rest) {}  
  22.   

  23. void Vehicle::start()  
  24. {  
  25.     if (status==rest)  
  26.     {  
  27.         status=running;  
  28.         currentSpeed=1;  
  29.     }  
  30.     else  
  31.         cout<<"车辆已经行驶!"<<endl;  
  32. }  
  33. //由running状态到rest, 当前速度小于5时,才允许停车  
  34. void Vehicle::stop()  
  35. {  
  36.     if (status==running)  
  37.         if(currentSpeed<5)  
  38.         {  
  39.             status=rest;  
  40.             currentSpeed=0;  
  41.         }  
  42.         else  
  43.             cout<<"车速太快!先减速再停车……"<<endl;  
  44.     else  
  45.         cout<<"车辆未启动!"<<endl;  
  46. }  
  47.   

  48. void Vehicle::speed_up()  
  49. {  
  50.     if (status==running)  
  51.         if(currentSpeed<maxSpeed)  
  52.             ++currentSpeed;  
  53.         else  
  54.             cout<<"请不要超速行驶……"<<endl;  
  55.     else  
  56.         cout<<"车辆未启动!"<<endl;  
  57. }  

  58. void Vehicle::slow_down()  
  59. {  
  60.     if (status==running)  
  61.     {  
  62.         if(currentSpeed>0)  
  63.             --currentSpeed;  
  64.     }  
  65.     else  
  66.         cout<<"车辆未启动!"<<endl;  
  67.     if(currentSpeed==0)  
  68.         status=rest;  
  69. }  
  70.   
  71. class Bicycle :virtual public Vehicle  
  72. {  
  73. protected:  
  74.     double height; 
  75. public:  
  76.     Bicycle(int maxS=10, int w=50, int h=0.7);   
  77. };  
  78.   
  79. Bicycle::Bicycle(int maxS, int w, int h):Vehicle(maxS, w),height(h) {}  
  80.   
  81. class Motorcar : virtual public Vehicle 
  82. {  
  83. protected:  
  84.     int seatNum;  
  85.     int passengerNum; 
  86. public:  
  87.     Motorcar(int maxS=150, int w=1500, int s=5, int p=1);    
  88.     void addPassenger(int p=1);   
  89. };  
  90.   

  91. Motorcar::Motorcar(int maxS, int w, int s, int p): Vehicle(maxS, w),seatNum(s),passengerNum(p) {}  
  92.   
  93.   
  94. void Motorcar::addPassenger(int p)  
  95. {  
  96.     if (status==running)  
  97.     {  
  98.         cout<<"车辆正在行驶,停车后再上下车!"<<endl;  
  99.     }  
  100.     else  
  101.     {  
  102.         passengerNum+=p;  
  103.         if(passengerNum>seatNum)  
  104.         {  
  105.             passengerNum=seatNum;  
  106.             cout<<"涉嫌超员,已清理后达到满员!"<<endl;  
  107.         }  
  108.         else if (passengerNum<1)  
  109.         {  
  110.             passengerNum=1;  
  111.             cout<<"请司机不要离开岗位!"<<endl;  
  112.         }  
  113.     }  
  114. }  
  115.   
  116. class Motorcycle: public Bicycle, public Motorcar 
  117. {  
  118. public:  
  119.     Motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7); 
  120.     void show();
  121. };  
  122.   
  123.  
  124. Motorcycle::Motorcycle(int maxS, int w, int s, int p, int h):Vehicle(maxS, w),Bicycle(maxS, w, h),Motorcar(maxS, w, s, p) {}  
  125.  
  126. void Motorcycle::show()  
  127. {  
  128.     cout<<"状态:";  
  129.     if(status==rest)  
  130.         cout<<"泊车;\t";  
  131.     else  
  132.         cout<<"行进;\t";  
  133.     cout<<"车速:"<<currentSpeed<<" / "<< maxSpeed <<"\t当前乘员:"<<passengerNum<<" / "<< seatNum << endl;  
  134. }  
  135.   
  136. int main( )  
  137. {  
  138.     Motorcycle m;  
  139.     bool end=false;  
  140.     while (!end)  
  141.     {  
  142.         cout<<"请操作:1-启动  2-加速  3-减速  4-有人上车  5-有人下车  6-停车 0-结束"<<endl;  
  143.         char keydown= _getch();
  144.         switch(keydown)  
  145.         {  
  146.         case '1':  
  147.             cout<<"选中的操作是1-启动\t";  
  148.             m.start();  
  149.             break;  
  150.         case '2':  
  151.             cout<<"选中的操作是2-加速\t";  
  152.             m.speed_up();  
  153.             break;  
  154.         case '3':  
  155.             cout<<"选中的操作是3-减速\t";  
  156.             m.slow_down();  
  157.             break;  
  158.         case '4':  
  159.             cout<<"选中的操作是4-有人上车\t";  
  160.             m.addPassenger();  
  161.             break;  
  162.         case '5':  
  163.             cout<<"选中的操作是5-有人下车\t";  
  164.             m.addPassenger(-1);  
  165.             break;  
  166.         case '6':  
  167.             cout<<"选中的操作是6-停车\t";  
  168.             m.stop();  
  169.             break;  
  170.         case '0':  
  171.             end=true;  
  172.             break;  
  173.         }  
  174.         m.show();  
  175.         cout<<endl;  
  176.         Sleep(200);   
  177.     }  
  178.     return 0;  
  179. }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值