当前位置:   article > 正文

2013级C++第12周(春)项目——成员的访问属性、多重继承_在下面一段类的定义中,自行车类的虚基类为车辆类

在下面一段类的定义中,自行车类的虚基类为车辆类

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接

第一部分 程序阅读 

1、阅读程序,分析类中成员的访问属性
  1. #include <iostream>
  2. using namespace std;
  3. class A //A为基类
  4. {
  5. public:
  6. void f1( );
  7. int i;
  8. protected:
  9. void f2();
  10. int j;
  11. private:
  12. int k;
  13. };
  14. class B: public A //B为A的公用派生类
  15. {
  16. public:
  17. void f3( );
  18. protected:
  19. int m;
  20. private:
  21. int n;
  22. };
  23. class C: public B //C为B的公用派生类
  24. {
  25. public:
  26. void f4();
  27. private:
  28. int p;
  29. };
  30. int main()
  31. {
  32. A a1; //a1是基类A的对象
  33. B b1; //b1是派生类B的对象
  34. C c1; //c1是派生类C的对象
  35. return 0;
  36. }
(1)在main函数中,能否用b1.i,b1.j和b1.k引用派生类中的基类A的成员i, j k?
(2)派生类B中的成员能否调用基类A中的成员函数f1和f2?
(3)派生类B中的成员函数能否引用基类A中的数据成员i, j k?
(4)能否在main函数中用c1.i, c1.j, c1.k, c1.m, c1.n, c1.p基类A的成员i, j k、派生类B的成员m, n、以及派生类C的成员p?
(5)能否在main函数中用c1.f1(), c1.f2(), c1.f3()和c1.f4()调用f1, f2, f3, f4成员函数?
(6)派生类C的成员函数f4能否调用基类A中的成员函数f1, f2和派生类中的成员函数f3?
2、阅读程序,请分析所有成员在各类的范围内的访问权限
  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. void f1( );
  7. protected:
  8. void f2();
  9. private:
  10. int i;
  11. };
  12. class B: public A
  13. {
  14. public:
  15. void f3( );
  16. int k;
  17. private:
  18. int m;
  19. };
  20. class C: protected B
  21. {
  22. public:
  23. void f4();
  24. protected:
  25. int n;
  26. private:
  27. int p;
  28. };
  29. class D: private C
  30. {
  31. public:
  32. void f5();
  33. protected:
  34. int q;
  35. private:
  36. int r;
  37. };
  38. int main(){
  39. A a1;
  40. B b1;
  41. C c1;
  42. D d1;
  43. return 0;
  44. }

第2部分 实践项目

【项目1 - 长颈鹿类对动物类的继承】理解基类中成员的访问限定符和派生类的继承方式
  请在下面的程序中要求的位置写下注释,声明相应的语句在语法上是否正确,为什么。在第一个程序中给出了示例,其他位置请仿照完成。在上机时,可以编译程序加以验证,阅读错误给出的英文提示,并加以理解。
(1)public继承方式下
  1. #include <iostream>
  2. using namespace std;
  3. class Animal //动物类
  4. {
  5. public:
  6. Animal() {}
  7. void eat(){
  8. cout << "eat\n";
  9. }
  10. protected:
  11. void play()
  12. {
  13. cout << "play\n";
  14. }
  15. private:
  16. void drink()
  17. {
  18. cout << "drink\n";
  19. }
  20. };
  21. class Giraffe: public Animal //长颈鹿类
  22. {
  23. public:
  24. Giraffe() {}
  25. void StrechNeck()
  26. {
  27. cout << "Strech neck \n";
  28. }
  29. private:
  30. void take()
  31. {
  32. eat(); // 正确,公有继承下,基类的公有成员对派生类可见
  33. drink(); // _______________
  34. play(); // _______________
  35. }
  36. };
  37. int main()
  38. {
  39. Giraffe gir; //定义派生类的对象
  40. gir.eat(); // 正确,公有继承下,基类的公有成员对派生类对象可见
  41. gir.play(); // _______________
  42. gir.drink(); // _______________
  43. gir.take(); // _______________
  44. gir.StrechNeck(); // _______________
  45. Animal ani;
  46. ani.eat(); // _______________
  47. ani.play(); // _______________
  48. ani.drink(); // _______________
  49. ani.take(); //错误,派生类的成员对基类对象(不论访问属性)不可见
  50. ani.StrechNeck(); // _______________
  51. return 0;
  52. }

(2)private继承方式下
  1. #include <iostream>
  2. using namespace std;
  3. class Animal
  4. {
  5. public:
  6. Animal() {}
  7. void eat()
  8. {
  9. cout << "eat\n";
  10. }
  11. protected:
  12. void play()
  13. {
  14. cout << "play\n";
  15. }
  16. private:
  17. void drink()
  18. {
  19. cout << "drink\n";
  20. }
  21. };
  22. class Giraffe: private Animal
  23. {
  24. public:
  25. Giraffe() {}
  26. void StrechNeck()
  27. {
  28. cout << "Strech neck \n";
  29. }
  30. void take()
  31. {
  32. eat(); // _______________
  33. drink(); // _______________
  34. play(); // _______________
  35. }
  36. };
  37. int main()
  38. {
  39. Giraffe gir;
  40. gir.eat(); // _______________
  41. gir.play(); // _______________
  42. gir.drink(); // _______________
  43. return 0;
  44. }

(3)protected继承方式下
  1. #include <iostream>
  2. using namespace std;
  3. class Animal
  4. {
  5. public:
  6. Animal() {}
  7. void eat()
  8. {
  9. cout << "eat\n";
  10. }
  11. protected:
  12. void play()
  13. {
  14. cout << "play\n";
  15. }
  16. private:
  17. void drink()
  18. {
  19. cout << "drink\n";
  20. }
  21. };
  22. class Giraffe: protected Animal
  23. {
  24. public:
  25. Giraffe() {}
  26. void StrechNeck()
  27. {
  28. cout << "Strech neck \n";
  29. }
  30. void take()
  31. {
  32. eat(); // _______________
  33. drink(); // _______________
  34. play(); // _______________
  35. }
  36. };
  37. int main()
  38. {
  39. Giraffe gir;
  40. gir.eat(); // _______________
  41. gir.play(); // _______________
  42. gir.drink(); // _______________
  43. return 0;
  44. }

【项目2 - 教师兼干部类】(第11章习题9)分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求: 
(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 
(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。 
(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。 
(4)在类体中声明成员函数,在类外定义成员函数。 
(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。


【项目3 - 摩托车继承自行车和机动车】在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承,如图所示。

    下载可执行文件链接motorcar.exe.

(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码;
(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。
(3)运行程序,享受开摩托的过程。(可以下载可执行文件 motorcar.exe,先运行再编程。不必申请驾照,这个摩托车很安全。)
(4)在报告中,请用自己的话写清楚使用虚基类解决什么问题?
  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. {
  22. protected:
  23. double height; //车高
  24. public:
  25. bicycle(int maxS=10, int w=50, int h=0.7); //定义构造函数
  26. };
  27. class motorcar : ______(2)__________//(2)机动车类的虚基类也为车辆类
  28. {
  29. protected:
  30. int seatNum; //座位数
  31. int passengerNum; //乘客人数
  32. public:
  33. motorcar(int maxS=150, int w=1500, int s=5, int p=1); //定义构造函数
  34. void addPassenger(int p=1); //增加搭载的乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。只有车停稳后才能上下客。
  35. };
  36. class motorcycle: ______(3)_________ //(3)摩托车类的基类为自行车类和机动车类
  37. {
  38. public:
  39. motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7);//定义构造函数
  40. void show(); //显示摩托车的运行状态
  41. };
  42. int main( )
  43. {
  44. motorcycle m;
  45. bool end=false;
  46. while (!end)
  47. {
  48. cout<<"请操作:1-启动 2-加速 3-减速 4-有人上车 5-有人下车 6-停车 0-结束"<<endl;
  49. char keydown= _getch(); //_getch()返回键盘上读取的字符
  50. switch(keydown)
  51. {
  52. case '1':
  53. cout<<"选中的操作是1-启动\t";
  54. m.start();
  55. break;
  56. case '2':
  57. cout<<"选中的操作是2-加速\t";
  58. m.speed_up();
  59. break;
  60. case '3':
  61. cout<<"选中的操作是3-减速\t";
  62. m.slow_down();
  63. break;
  64. case '4':
  65. cout<<"选中的操作是4-有人上车\t";
  66. m.addPassenger();
  67. break;
  68. case '5':
  69. cout<<"选中的操作是5-有人下车\t";
  70. m.addPassenger(-1);
  71. break;
  72. case '6':
  73. cout<<"选中的操作是6-停车\t";
  74. m.stop();
  75. break;
  76. case '0':
  77. end=true;
  78. break;
  79. }
  80. m.show();
  81. cout<<endl;
  82. Sleep(200); //要包含头文件<windows.h>
  83. }
  84. return 0;
  85. }

【项目4】日期时间类
  定义一个日期类Date,数据成员包括年、月、日,SetDate(int y,int m,int d)和PrintDate()函数分别用于设置日期和显示日期;再定义一个时间类Time,数据成员包括时、分、秒,SetTime(int h,int m,int s)和PrintTime()函数分别用于设置时间和显示时间,在此基础上再定义一个日期时间类TimeDate,充分利用已有的两个类中提供的方法,实现日期和时间的设置和显示,请实现类,下面是用于测试的主函数及参考运行结果。
  1. int main()
  2. {
  3. TimeDate dt_a,dt_b(2010,4,16,9,30,0);
  4. cout<<"dt_a: ";
  5. dt_a.PrintDate_Time();
  6. cout<<endl;
  7. cout<<"dt_b: ";
  8. dt_b.PrintDate_Time();
  9. dt_a.SetTime(20,00,00);
  10. dt_a.SetDate(2008,8,7);
  11. cout<<endl;
  12. cout<<"dt_after uptate: ";
  13. dt_a.PrintDate_Time();
  14. return 0;
  15. }




================= 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/106049
推荐阅读
相关标签
  

闽ICP备14008679号