C++深度解析(33)—继承的概念和意义

1.类之间的关联关系

  • 组合关系:整体与部分的关系
  • 继承关系:父子关系

2.组合与继承关系关系的特点 

  • 组合关系的特点

2.1组合关系的特点

将其它类的对象作为当前类的成员使用
当前类的对象与成员对象的生命期相同
成员对象在用法上与普通对象完全一致

**2.2继承指类之间的父子关系 **

子类拥有父类的所有属性(成员变量)和行为(成员方法)
子类就是一种特殊的父类
子类对象可以当作父类对象使用
子类中可以添加父类没有的方法和属性

3.组合与继承的实例分析

  • 组合关系的描述   

 
 
  1. #include <iostream>
  2. using namespace std;
  3. //内存类
  4. class Memory
  5. {
  6. int MB;
  7. public:
  8. Memory() // 类的构造函数
  9. {
  10. MB = 512;
  11. cout << "Memory()" << endl;
  12. }
  13. int value()
  14. {
  15. return MB;
  16. }
  17. ~Memory()
  18. {
  19. cout << "~Memory()" << endl;
  20. }
  21. };
  22. // 硬盘类
  23. class Disk
  24. {
  25. public:
  26. Disk()
  27. {
  28. cout << "Disk()" << endl;
  29. }
  30. ~Disk()
  31. {
  32. cout << "~Disk()" << endl;
  33. }
  34. };
  35. // CPU类
  36. class CPU
  37. {
  38. public:
  39. CPU()
  40. {
  41. cout << "CPU" << endl;
  42. }
  43. ~CPU()
  44. {
  45. cout << "~CPU" << endl;
  46. }
  47. };
  48. // 主板类
  49. class MainBoard
  50. {
  51. public:
  52. MainBoard()
  53. {
  54. cout << "MainBoard" << endl;
  55. }
  56. ~MainBoard()
  57. {
  58. cout << "~MainBoard" << endl;
  59. }
  60. };
  61. //计算机类
  62. class Computer
  63. {
  64. //组合关系:部分-整体关系(与Computer对象同生命期)
  65. Memory mMem;
  66. Disk mDisk; // 就是直接将别的类在本类声明一个对象,拼凑在一起使用
  67. CPU mCPU;
  68. MainBoard mMainBoard;
  69. public:
  70. Computer()
  71. {
  72. cout << "Computer()" << endl;
  73. }
  74. int value()
  75. {
  76. return mMem.value();
  77. }
  78. void power()
  79. {
  80. cout << "power()" << endl;
  81. }
  82. void reset()
  83. {
  84. cout << "reset" << endl;
  85. }
  86. ~Computer()
  87. {
  88. cout << "~Computer" << endl;
  89. }
  90. };
  91. void run()
  92. {
  93. Computer c; // 组合初始化构造函数,先成员对象,再自己。
  94. // 先构造成员对象,按照声明的顺序,再调用类构造函数
  95. cout << c.value() << endl;
  96. }
  97. int main()
  98. {
  99. run();
  100. system( "pause");
  101. return 0;
  102. }
  • 运行结果

  • 继承初体验    

 
 
  1. #include <iostream>
  2. using namespace std;
  3. class Parent // 父类(基类)
  4. {
  5. int mv;
  6. public:
  7. Parent()
  8. {
  9. cout << "Parent()" << endl;
  10. mv = 100; // 构造函数给mv赋值
  11. }
  12. void method()
  13. {
  14. cout << "mv = " << mv << endl;
  15. }
  16. };
  17. class Child : public Parent // /子类(派生类),拥有父类所有的属性和方法
  18. {
  19. public:
  20. void hello()
  21. {
  22. cout << "I am Child class !" << endl;
  23. //cout << mv << endl;     //测试,子类不能直接使用父类的私有变量
  24. }
  25. };
  26. int main()
  27. {
  28. Child c;
  29. c.hello();
  30. c.method();
  31. system( "pause");
  32. return 0;
  33. }
  • 运行结果:

4.重要规则

  • 子类就是一个特殊的父类
  • 子类对象可以直接初始化父类对象(但子类对象不能直接使用父类的私有成员变量!可以用protected关键字改变private
  • 子类对象可以直接赋值给父类对象(父子兼容性)

5.继承的意义

  • 继承是C++是代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写己有的功能,或者添加新功能

 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //内存类
  5. class Memory
  6. {
  7. public:
  8. Memory()
  9. {
  10. cout << "Memory()" << endl;
  11. }
  12. ~Memory()
  13. {
  14. cout << "~Memory()" << endl;
  15. }
  16. };
  17. //硬盘类
  18. class Disk
  19. {
  20. public:
  21. Disk()
  22. {
  23. cout << "Disk()" << endl;
  24. }
  25. ~Disk()
  26. {
  27. cout << "~Disk()" << endl;
  28. }
  29. };
  30. //CPU类
  31. class CPU
  32. {
  33. public:
  34. CPU()
  35. {
  36. cout << "CPU()" << endl;
  37. }
  38. ~CPU()
  39. {
  40. cout << "~CPU()" << endl;
  41. }
  42. };
  43. //主板类
  44. class MainBoard
  45. {
  46. public:
  47. MainBoard()
  48. {
  49. cout << "MainBoard()" << endl;
  50. }
  51. ~MainBoard()
  52. {
  53. cout << "~MainBoard()" << endl;
  54. }
  55. };
  56. //计算机类
  57. class Computer
  58. {
  59. //组合关系:部分-整体关系(与Computer对象同生命期)
  60. Memory mMem;
  61. Disk mDisk;
  62. CPU mCPU; //想要在这个类的子类中使用这些成员方法。必须在这个类的public下面手工调用。
  63. MainBoard mMainBoard;
  64. int value;
  65. public:
  66. Computer()
  67. {
  68. cout << "Computer()" << endl;
  69. }
  70. void power()
  71. {
  72. cout << "power()" << endl;
  73. }
  74. void reset()
  75. {
  76. cout << "reset()" << endl;
  77. }
  78. ~Computer()
  79. {
  80. cout << "~Computer()" << endl;
  81. }
  82. };
  83. //惠普笔记本
  84. class HPBook : public Computer
  85. {
  86. string mOS;
  87. public:
  88. HPBook()
  89. {
  90. mOS = "Windows 8"; // 预装Windows8 操作系统
  91. }
  92. void install(string os)
  93. {
  94. mOS = os; //更新操作系统
  95. }
  96. void OS()
  97. {
  98. cout << mOS << endl;
  99. }
  100. };
  101. //苹果电脑
  102. class MacBook : public Computer
  103. {
  104. public:
  105. void OS()
  106. {
  107. //cout << Computer::value << endl;  // 私有变量,不能直接访问
  108. cout << "Mac OS" << endl;
  109. }
  110. };
  111. void run()
  112. {
  113. HPBook hp; // 调用父类相应构造函数,再成员,最后自己。
  114. hp.power(); // 可以使用公共的方法
  115. hp.install( "Ubuntu 16.04 LTS");
  116. hp.OS();
  117. cout << endl;
  118. MacBook mac; // 调用父类相应构造函数,再成员,最后自己。
  119. mac.OS();
  120. }
  121. int main()
  122. {
  123. run();
  124. system( "pause");
  125. return 0;
  126. }
  • 运行结果

6.小结

  • 继承是面向对象中类之间的一种关系
  • 子类拥有父类的所有属性和行为
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类没有的方法和属性
  • 继承是面向对象中代码复用的重要手段 

ps:什么情况下用继承?什么情况下用组合呢?

  • 继承:譬如你有一个电脑普通类,你想改造成苹果的,惠普的,联想的...这时候就要继承,添加别的功能。   
  • 组合:譬如你想要组装一台电脑,你有一堆硬件,硬盘,CPU,主机外壳,内存条,显示屏,他们之间没有任何重合的地方,彼此独立的,就可以组合,组合在一起干活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值