第十二周 任务三

悠悠 2022-06-12 04:42 310阅读 0赞
  1. /* (程序头部注释开始)
  2. * 程序的版权和版本声明部分
  3. * Copyright (c) 2012, 烟台大学计算机学院学生
  4. * All rights reserved.
  5. * 文件名称: 练习使用虚基类
  6. * 作 者: 薛广晨
  7. * 完成日期: 2012 年 4 月 27 日
  8. * 版 本 号: x1.0
  9. * 对任务及求解方法的描述部分
  10. * 输入描述: 练习使用虚基类
  11. * 问题描述:
  12. *【任务3】在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承。
  13. (1)根据上面各类间关系的描述,补全下面程序段中空缺的代码
  14. (2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。
  15. (3)运行程序,享受开摩托的过程。(BB平台上提供了一个可执行文件,可以先运行再编程。不必申请驾照,这个摩托车很安全。)
  16. (4)在报告中回答问题:本题中使用虚基类的好处是什么?
  17. * 程序输出: ......
  18. * 程序头部的注释结束
  19. */
  20. #include <iostream>
  21. #include<conio.h>
  22. #include <windows.h>
  23. using namespace std;
  24. enum vehicleStaus {rest, running}; //车辆状态:泊车、行进
  25. class vehicle //车辆类
  26. {
  27. protected:
  28. int maxSpeed; //最大车速
  29. int currentSpeed; //当前速度
  30. int weight; //车重
  31. vehicleStaus status; //rest-泊车状态;running-行进状态
  32. public:
  33. vehicle(int maxS, int w) : maxSpeed(maxS), weight(w), currentSpeed(0), status(rest){} //构造函数,初始时,当前速度总为0且处在停车状态
  34. void start(); //由rest状态到running, 初速为1
  35. void stop(); //由running状态到rest, 当前速度小于5时,才允许停车
  36. void speed_up(); //加速,调用1次,速度加1
  37. void slow_down(); //减速,调用1次,速度减1,速度为0时,停车
  38. };
  39. void vehicle :: start() //由rest状态到running, 初速为1
  40. {
  41. status = running;
  42. currentSpeed = 1;
  43. }
  44. void vehicle :: stop() //由running状态到rest, 当前速度小于5时,才允许停车
  45. {
  46. if(currentSpeed > 5)
  47. cout << "车速太快!先减速再停车……";
  48. else
  49. {
  50. currentSpeed = 0;
  51. status = rest;
  52. }
  53. }
  54. void vehicle :: speed_up() //加速,调用1次,速度加1
  55. {
  56. ++currentSpeed;
  57. }
  58. void vehicle :: slow_down() //减速,调用1次,速度减1,速度为0时,停车
  59. {
  60. --currentSpeed;
  61. }
  62. class bicycle : virtual public vehicle//(1)自行车类的虚基类为车辆类
  63. {
  64. protected:
  65. double height; //车高
  66. public:
  67. bicycle(int maxS = 10, int w = 50, int h = 0.7) : vehicle(maxS, w), height(h){} //定义构造函数
  68. };
  69. class motorcar : virtual public vehicle//(2)机动车类的虚基类也为车辆类
  70. {
  71. protected:
  72. int seatNum; //座位数
  73. int passengerNum; //乘客人数
  74. public:
  75. motorcar(int maxS = 150, int w = 1500, int s = 5, int p = 1) : vehicle(maxS, w), passengerNum(p),seatNum(s){} //定义构造函数
  76. void addPassenger(int p=1); //搭载乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。上下车时要保证安全……
  77. };
  78. void motorcar :: addPassenger(int p)//搭载乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。上下车时要保证安全……
  79. {
  80. if(currentSpeed != 0)cout << "车辆正在行驶,停车后再上下车!" << endl;
  81. else
  82. {
  83. passengerNum = passengerNum + p;
  84. if(passengerNum == 0)
  85. {
  86. cout << "请司机不要离开岗位!" << endl;
  87. passengerNum = 1;
  88. currentSpeed = 0;
  89. status = rest;
  90. }
  91. else if(passengerNum > seatNum)
  92. {
  93. cout << "涉嫌超员,已清理后达到满员!" << endl;
  94. passengerNum = seatNum;
  95. }
  96. }
  97. }
  98. class motorcycle : public bicycle, public motorcar //(3)摩托车类的基类为自行车类和机动车类
  99. {
  100. public:
  101. 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){} //定义构造函数
  102. void show(); //显示摩托车的运行状态
  103. };
  104. void motorcycle :: show() //显示摩托车的运行状态
  105. {
  106. cout << "状态:" ;
  107. if(status)cout << "行进";
  108. else cout << "泊车";
  109. cout << " " << "车速:" << currentSpeed << "/" << maxSpeed << " " << "当前乘员:" << passengerNum << "/" << seatNum << endl;
  110. }
  111. int main( )
  112. {
  113. motorcycle m;
  114. bool end = false;
  115. while (!end){
  116. cout<<"请操作:1-启动 2-加速 3-减速 4-有人上车 5-有人下车 6-停车 0-结束"<<endl;
  117. char keydown= _getch(); //_getch()返回键盘上读取的字符,应包含头文件<conio.h>
  118. switch(keydown)
  119. {
  120. case '1':
  121. cout<<"操作(启动)\t"; m.start(); break;
  122. case '2':
  123. cout<<"操作(加速)\t"; m.speed_up(); break;
  124. case '3':
  125. cout<<"操作(减速)\t"; m.slow_down(); break;
  126. case '4':
  127. cout<<"操作(有人上车)\t"; m.addPassenger(); break;
  128. case '5':
  129. cout<<"操作(有人下车)\t"; m.addPassenger(-1); break;
  130. case '6':
  131. cout<<"操作(停车)\t"; m.stop(); break;
  132. case '0':
  133. end=true; break;
  134. }
  135. m.show();
  136. cout<<endl;
  137. Sleep(200); //要包含头文件<windows.h>
  138. }
  139. system("pause");
  140. return 0;
  141. }
  142. 上机感言:我也有自己的摩托车了好爽啊,
  143. 虚基类的使用是数据的使用变的方便,不用指定哪个类了,能很好的解决二义性

发表评论

表情:
评论列表 (有 0 条评论,310人围观)

还没有评论,来说两句吧...

相关阅读

    相关 任务

    实验目的:学会使用循环控制语句解决实际问题 实验内容:编写多分支选择结构程序,根据个人月收入总额,计算出应缴税款和税后收入。 include <iostrea