第十二周项目二——摩托车继承自行车和机动车

本文详细介绍了如何利用C++的虚基类特性设计摩托车类,通过继承和多态实现了摩托车的基本功能,包括启动、加速、减速、载客和停车等操作,并通过代码示例展示了摩托车类的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 *Copyright  (c)  2014,烟台大学计算机学院
 *All rights reserved.
 *文件名称: test.cpp
 *作        者:陈丹
 *完成日期:2015年5月26日
 *版本号:v1.0
 *
 *问题描述:自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承.
(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码;
(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。
(3)运行程序,享受开摩托的过程。(可以下载可执行文件motorcar.exe,先运行再编程。不必申请驾照,这个摩托车很安全。)
(4)在报告中,请用自己的话写清楚使用虚基类解决什么问题?
 *输入描述:
 *程序输出:
 */
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
#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();//加速,调用一次,速度加一
    void slow_down();//减速,调用一次,速度减一,速度为零时,停车

};
vehicle::vehicle(int maxS,int w)//构造函数 ,初始时当前速度是0且处于停车状态
{
    maxSpeed=maxS;
    weight=w;
    currentSpeed=0;
    status=rest;
}
void vehicle::start()
{
    currentSpeed=1;
    status=running;
}
void vehicle::stop()
{
    if(status!=rest)
    {
        if(currentSpeed<5)
        {
            status=rest;
            currentSpeed=0;
        }
        else
            cout<<"当前速度过大无法停车,请减速"<<endl;
    }
    else
        cout<<"当前为泊车状态。"<<endl;
}
void vehicle::speed_up()
{
   if(status==rest)
    cout<<"当前为泊车状态,无法减速"<<endl;
   else
   {
       if(currentSpeed<=maxSpeed)
            ++currentSpeed;
        else
            cout<<"速度已达到最大,无法加速"<<endl;
   }
}
void vehicle::slow_down()
{
     if(status==rest)
        cout<<"当前为泊车状态,无法减速"<<endl;
    else
    {
        if(--currentSpeed==0)
            status=rest;
    }
}
class bicyle:virtual public vehicle//自行车类的虚基类为车辆类
{
protected:
    double height;//车高
public:
    bicyle(int maxS=10,int w=50,double h=0.7):vehicle(maxS,w),height(h){}//定义构造函数
};
class motorcar:virtual public vehicle//机动车类的虚基类也为车辆类
{
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为负数。当然车上乘客至少有一个(司机)。只有车停稳后才能上下客。
};
void motorcar::addPassenger(int p)
{
    if(status==running)
        cout<<"当前为行驶状态,请停车后再上下车"<<endl;
    else
    {
        if(p>0)
        {
            if((passengerNum+1)>seatNum)
                cout<<"超载!无法上车"<<endl;
            else
                ++passengerNum;
        }
        else
        {
            if(passengerNum==1)
                cout<<"司机不能下车"<<endl;
            else
                --passengerNum;
        }
    }
}
class motorcycle:public bicyle,public motorcar//摩托车类的基类为自行车类和机动车类
{
public:
    motorcycle(int maxS=90,int w=100,int s=3,int p=1,double h=0.7):vehicle(maxS,w),bicyle(maxS,w,h),motorcar(maxS,w,s,p) {} //定义构造函数
    void show();//显示摩托车的运行状态
};
void motorcycle::show()
{
    cout<<"状态:"<<((status==rest)?"泊车":"行进")<<'\t';
    cout<<"车速:"<<currentSpeed<<"/"<<maxSpeed<<'\t';
    cout<<"当前乘员:"<<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;
}

运行结果:



学习总结:

我只想说折腾了好几个小时,打败了所有八阿哥成功运行的感觉真的很棒!!!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值