天天看點

第十二周 【項目2 - 機車繼承自行車和機動車】

【項目2 - 機車繼承自行車和機動車】

在以下一段類的定義中,自行車類的虛基類為車輛類。機動車類的虛基類也為車輛類,機車類的基類為自行車類和機動車類。類之間均為公有繼承,如圖所看到的。

第十二周 【項目2 - 機車繼承自行車和機動車】

下載下傳可運作檔案連結​​motorcar.exe​​.

(1)依據上面各類間關系的描寫叙述,補全以下程式段中空缺的代碼;

(2)實作程式中聲明的成員函數,注意對應操作中的動作發生的條件不能滿足時應給出提示。

(3)執行程式。享受開摩托的過程。

(能夠下載下傳可執行檔案​​motorcar.exe​​,先執行再程式設計。不必申請駕照,這個機車非常安全。)

(4)在報告中,請用自己的話寫清楚使用虛基類解決什麼問題?

[cpp] ​​view plain​

​​​copy​​​​print​​​​?​​​

​​

  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. class bicycle :_____(1)_________//(1)自行車類的虛基類為車輛類  
  21.     double height; //車高  
  22.     bicycle(int maxS=10, int w=50, int h=0.7);   //定義構造函數  
  23. class motorcar : ______(2)__________//(2)機動車類的虛基類也為車輛類  
  24.     int seatNum; //座位數  
  25.     int passengerNum; //乘客人數  
  26.     motorcar(int maxS=150, int w=1500, int s=5, int p=1);   //定義構造函數  
  27.     void addPassenger(int p=1);   //添加搭載的乘客,超員要拒載,有人下車時。p為負數。當然車上乘客至少有1個(司機)。僅僅有車停穩後才幹上下客。  
  28. class motorcycle: ______(3)_________ //(3)機車類的基類為自行車類和機動車類  
  29. public:      
  30.     motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7);//定義構造函數  
  31.     void show(); //顯示機車的執行狀态  
  32. int main( )  
  33.     motorcycle m;  
  34.     bool end=false;  
  35.     while (!end)  
  36.     {  
  37.         cout<<"請操作:1-啟動  2-加速  3-減速  4-有人上車  5-有人下車  6-停車 0-結束"<<endl;  
  38.         char keydown= _getch(); //_getch()傳回鍵盤上讀取的字元  
  39.         switch(keydown)  
  40.         {  
  41.         case '1':  
  42.             cout<<"選中的操作是1-啟動\t";  
  43.             m.start();  
  44.             break;  
  45.         case '2':  
  46.             cout<<"選中的操作是2-加速\t";  
  47.             m.speed_up();  
  48.         case '3':  
  49.             cout<<"選中的操作是3-減速\t";  
  50.             m.slow_down();  
  51.         case '4':  
  52.             cout<<"選中的操作是4-有人上車\t";  
  53.             m.addPassenger();  
  54.         case '5':  
  55.             cout<<"選中的操作是5-有人下車\t";  
  56.             m.addPassenger(-1);  
  57.         case '6':  
  58.             cout<<"選中的操作是6-停車\t";  
  59.             m.stop();  
  60.         case '0':  
  61.             end=true;  
  62.         }  
  63.         m.show();  
  64.         cout<<endl;  
  65.         Sleep(200);  //要包括頭檔案<windows.h>  
  66.     }  
  67.     return 0;  
  68. }  

參考執行結果例如以下:

/*
*Copyright (c)2014,煙台大學計算機與控制project學院
*All rights reserved.
*檔案名:d.cpp
*作    者:張旺華
*完畢日期:2015年6月3日
*版 本 号:v1.0
*/
#include <iostream>
#include<conio.h>
#include <windows.h>
using namespace std;
enum vehicleStaus {rest, running};  //車輛狀态:泊車、行進
class vehicle //車輛類
{
protected:
    int maxSpeed;       //最大車速
    int currentSpeed;   //目前速度
    int weight;         //車重
    vehicleStaus status; //rest-泊車狀态;running-行進狀态
public:
    vehicle(int maxS, int w); //構造函數,初始時,目前速度總為0且處在停車狀态
    void start();  //由rest狀态到running, 初速為1
    void stop(); //由running狀态到rest, 目前速度小于5時。才同意停車
    void speed_up();  //加速,調用1次。速度加1
    void slow_down(); //減速。調用1次。速度減1,速度為0時,停車
};
vehicle::vehicle(int maxS, int w) //構造函數,初始時,目前速度總為0且處在停車狀态
{
    maxSpeed=maxS;
    weight=w;
    currentSpeed=0;
    status=rest;
}
void vehicle::start()  //由rest狀态到running, 初速為1
{
    currentSpeed=1;
    status=running;
}
void vehicle::stop() //由running狀态到rest, 目前速度小于5時。才同意停車
{
    if(currentSpeed<5)
    {
        currentSpeed=0;
        status=rest;
    }
    else
    {
        cout<<"目前速度太快。請減速後停車"<< endl;
    }
}
void vehicle::speed_up()  //加速,調用1次,速度加1
{
    if(currentSpeed==maxSpeed)
        cout<<"目前速度達到最大不能再進行加速。"<<endl;
    else
        currentSpeed++;
}
void vehicle::slow_down() //減速。調用1次,速度減1,速度為0時,停車
{
    if(currentSpeed==0)
        cout<<"目前速度為0,無需減速。"<<endl;
    else
        currentSpeed--;
}
class bicycle :virtual public vehicle//(1)自行車類的虛基類為車輛類
{
protected:
    double height; //車高
public:
    bicycle(int maxS=10, int w=50, int h=0.7):vehicle(maxS,w),height(h) {}  //定義構造函數
};

class motorcar : virtual public vehicle//(2)機動車類的虛基類也為車輛類
{
protected:
    int seatNum; //座位數
    int passengerNum; //乘客人數
public:
    motorcar(int maxS=150, int w=1500, int s=5, int p=1):vehicle(maxS,w),seatNum(s),passengerNum(p) {} //定義構造函數
    void addPassenger(int p=1);   //添加搭載的乘客。超員要拒載,有人下車時,p為負數。當然車上乘客至少有1個(司機)。僅僅有車停穩後才幹上下客。

};
void motorcar::addPassenger(int p)   //添加搭載的乘客,超員要拒載。有人下車時。p為負數。
當然車上乘客至少有1個(司機)。僅僅有車停穩後才幹上下客。

{
    if (status==running)
    {
        cout<<"車輛正在行駛,停車後再上下車!
"<<endl;
    }
    else
    {
        passengerNum+=p;
        if(passengerNum>seatNum)
        {
            passengerNum=seatNum;
            cout<<"涉嫌超員,已清理後達到滿員。"<<endl;
        }
        else if (passengerNum<1)
        {
            passengerNum=1;
            cout<<"請司機不要離開崗位!"<<endl;
        }
    }
}
class motorcycle: public bicycle,public  motorcar//(3)機車類的基類為自行車類和機動車類
{
public:
    motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7):vehicle(maxS, w),bicycle(maxS, w, h),motorcar(maxS, w, s, p) {} //定義構造函數
    void show(); //顯示機車的執行狀态
};
void motorcycle::show() //顯示機車的執行狀态
{
    cout<<"狀态:";
    if(status==rest)
        cout<<"泊車;\t";
    else
        cout<<"行進;\t";
    cout<<"車速:"<<currentSpeed<<" / "<< maxSpeed <<"\t目前乘員:"<<passengerNum<<" / "<< seatNum << endl;
}
int main( )
{
    motorcycle m;
    bool end=false;
    while (!end)
    {
        cout<<"請操作:1-啟動  2-加速  3-減速  4-有人上車  5-有人下車  6-停車 0-結束"<<endl;
        char keydown= _getch(); //_getch()傳回鍵盤上讀取的字元
        switch(keydown)
        {
        case '1':
            cout<<"選中的操作是1-啟動\t";
            m.start();
            break;
        case '2':
            cout<<"選中的操作是2-加速\t";
            m.speed_up();
            break;
        case '3':
            cout<<"選中的操作是3-減速\t";
            m.slow_down();
            break;
        case '4':
            cout<<"選中的操作是4-有人上車\t";
            m.addPassenger();
            break;
        case '5':
            cout<<"選中的操作是5-有人下車\t";
            m.addPassenger(-1);
            break;
        case '6':
            cout<<"選中的操作是6-停車\t";
            m.stop();
            break;
        case '0':
            end=true;
            break;
        }
        m.show();
        cout<<endl;
        Sleep(200);  //要包括頭檔案<windows.h>
    }
    return 0;
}      

執行結果:

第十二周 【項目2 - 機車繼承自行車和機動車】

知識點運用:

在這裡使用了 枚舉來定義車輛的 狀态,使它更加生動。