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

2023-11-20 12:48

本文主要是介绍第十二周项目二--摩托车继承自行车和机动车,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题及代码:

/* Copyright (c) 2014, 烟台大学计算机学院 
* All rights reserved. 
* 文件名称:test.cpp 
* 作    者:尚 月 
* 完成日期:2015年 05 月 27 日 
* 版 本 号:v1.0 
* 
* 问题描述: (1)补全线面程序段中空缺的代码
(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示
(3)运行程序,享受开摩托的过程。
(4)在报告中,请用自己的话写清楚使用虚基类解决什么问题
* 程序输入: 输入数字
* 程序输出:按要求输出 
*/  
#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时,停车
};
//构造函数,初始时,当前速度总为0且处在停车状态
Vehicle::Vehicle(int maxS, int w):maxSpeed(maxS), currentSpeed(0),weight(w), status(rest) {}
//启动:由rest状态到running, 初速为1
void Vehicle::start()
{
if (status==rest)
{
status=running;
currentSpeed=1;
}
else
cout<<"车辆已经行驶!"<<endl;
}
//由running状态到rest, 当前速度小于5时,才允许停车
void Vehicle::stop()
{
if (status==running)
if(currentSpeed<5)
{
status=rest;
currentSpeed=0;
}
else
cout<<"车速太快!先减速再停车……"<<endl;
else
cout<<"车辆未启动!"<<endl;
}
//加速,调用1次,速度加1
void Vehicle::speed_up()
{
if (status==running)
if(currentSpeed<maxSpeed)
++currentSpeed;
else
cout<<"请不要超速行驶……"<<endl;
else
cout<<"车辆未启动!"<<endl;
}
//减速,调用1次,速度减1,速度为0时,停车
void Vehicle::slow_down()
{
if (status==running)
{
if(currentSpeed>0)
--currentSpeed;
}
else
cout<<"车辆未启动!"<<endl;
if(currentSpeed==0)
status=rest;
}
class Bicycle :virtual public Vehicle //(1)自行车类的虚基类为车辆类
{
protected:
double height; //车高
public:
Bicycle(int maxS=10, int w=50, int h=0.7);   //定义构造函数
};
//定义构造函数
Bicycle::Bicycle(int maxS, int w, int h):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);   //定义构造函数
void addPassenger(int p=1);   //搭载乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。上下车时要保证安全……
};
//定义构造函数
Motorcar::Motorcar(int maxS, int w, int s, int p): Vehicle(maxS, w),seatNum(s),passengerNum(p) {}
//搭载乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。上下车时要保证安全……
void Motorcar::addPassenger(int p)
{
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);   //定义构造函数
void show(); //显示摩托车的运行状态
};
//定义构造函数
Motorcycle::Motorcycle(int maxS, int w, int s, int p, int h):Vehicle(maxS, w),Bicycle(maxS, w, h),Motorcar(maxS, w, s, p) {}
//显示摩托车的运行状态
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()返回键盘上读取的字符,应包含头文件<conio.h>
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;
}


运行结果:

学习总结:虚基类解决二义性问题,当有多个类有定义了相同的函数名时,保留一个作为公用的。

这篇关于第十二周项目二--摩托车继承自行车和机动车的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/394702

相关文章

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1