kqlul123

Лекция(Наследование)

Oct 12th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.85 KB | None | 0 0
  1. Наследование позволяет создавать классы на базе ранее созданных.
  2.  
  3. Изменения, возможные при наследовании
  4. 1) можно добавлять в производный класс новые члены(поля/методы)
  5. 2) можно изменять реализацию унаследованных методов
  6. 3) можно изменять режимы доступа к унаследованным классам
  7.  
  8. Наследование - инструмент повторного использования кода
  9.  
  10. Пример:
  11. -учащееся
  12. -работяги
  13. -пенсионеры
  14.  
  15. Создать класс человек и на базе его создать наследников(-учащееся-работяги-пенсионеры)
  16. Наследование позволяет реализовать динамический полиморфизм
  17. Наследование позволяет удобно создавать иерархию родственных типов.
  18.  
  19.  
  20. Человек - класс-родитель
  21. Остальные - классы-наследники(дочерний\производный класс)
  22.  
  23. class TParent
  24. {
  25. ..
  26. };
  27. //реализация
  28. class TChild:режим_наследования TParent
  29. {
  30. Специфические члены класса TChild
  31. };
  32. //реализация специфических членов класса TChild
  33.  
  34. Режимы наследования:
  35. -public(Все члены класса - родителя наследуются со своими спецификаторами доступа)
  36. -protected(private наследуется как private, остальное - protected)
  37. -private(все наследуется как private)
  38.  
  39. class TPar{
  40. int a;
  41. protected:
  42. float b;
  43. public:
  44. double c;
  45. void p_vvod();
  46. void p_vivod();
  47. };
  48. void TPar::p_vvod()
  49. {
  50. cout << "вв. a, b , c";
  51. cin >> a >> b >> c;
  52. }
  53. void TPar::p_vivod()
  54. {
  55. cout << a << b << c;
  56. }
  57.  
  58. class TChl:public TPar
  59. {
  60. char x;
  61. protected:
  62. int y;
  63. public:
  64. float z;
  65. void c_vvod();
  66. void c_vivod();
  67. };
  68. //реализация
  69. void TChl::c_vvod()
  70. {
  71. cout << "x , y , z";
  72. cin >> x >> y >> z;
  73. p_vvod(); //вызов унаследованного метода
  74. }
  75.  
  76. void TChl::c_vivod()
  77. {
  78. cout << x << y << z;
  79. p_vivod();
  80. }
  81.  
  82. void main()
  83. {
  84. TPar p; //16 байт
  85. TChl d; //9+16 = 25 байт
  86. p.p_vvod();
  87. p.p_vivod();
  88. cout << p.c << endl;
  89. d.c_vvod();
  90. d.c_vivod();
  91. d.p_vvod();
  92. d.p_vivod();
  93. cout << d.z << d.c << endl; //доступен только public
  94.  
  95.  
  96. Что изменится если режим наследования будет private?
  97. Станет недоступным:d.p_vvod();
  98. d.p_vivod();
  99. d.c
  100.  
  101. Наследование != Агрегирование
  102.  
  103. Агрегирование:
  104. class TA{..};
  105. class TB{TA*obj или TA obj};
  106.  
  107. Наследование:
  108. class TP{...};
  109. class TC:режим TP
  110. {...};
  111.  
  112.  
  113. Конструкторы при наследовании:
  114. Объект дочернего класса одновременно является и объектом родительского класса
  115. Когда создается объект дочернего класса сначала вызывается конструктор родительского класса, выделяется память под изначальные поля, потом память для специфических полей класса-наследника.
  116. Разрушение в обратной последовательности.
  117. Явно заданные конструкторы не наследуются.
  118.  
  119. Если прописываем конструкторы с параметрами, то конструктор производного класса обязан обеспечивать значениями все свои поля, включая унаследованные.
  120.  
  121. class TPr{
  122. float x, y;
  123. public:
  124. TPr(float xx=1, float yy=2)
  125. void p_vivod();
  126. };
  127. //Реализация
  128. TPr::TPr(float xx, float yy)
  129. {
  130. x=xx; y=yy;}
  131. void TPr::p_vivod()
  132. {
  133. cout << x << y << endl;
  134. }
  135.  
  136. class TPar:public TPr{
  137. float z;
  138. TPar(float xx=4, float yy=5, float zz=6);
  139. void c_vivod();
  140. };
  141.  
  142. TPar::TPar(float xx, float yy, float zz):TPr(xx,yy) //Вызов родительского конструктора
  143. {z=zz}
  144.  
  145. c_vivod как в предыдущем примере.
  146.  
  147.  
  148. Одноименные методы при наследовании:
  149. class TPar
  150. {
  151. int x;
  152. public:
  153. TPar(int xx = 1);
  154. 1)void p_vvod();
  155. 2)void vivod();
  156. };
  157. TPar::TPar(int xx)
  158. {x=xx};
  159.  
  160. p_vivod также
  161. void TPar::vivod()
  162. cout << x << endl;
  163. }
  164.  
  165. class TChl: public TPar
  166. {
  167. int y;
  168. public:
  169. TChl(int xx=1, int yy=2);
  170. 3)void c_vvod();
  171. 4)void vivod();
  172. };
  173.  
  174. TChl::TChl(int xx, int yy): TPar(xx)
  175. {y=yy;}
  176. void TChl::c_vvod()
  177. {
  178. cout << "Вв. y"; cin >> y |Met. 1
  179. p_vvod(); |
  180.  
  181. void TChl::vivod()
  182. {
  183. cout << y; TPar::vivod(); |Met. 2
  184. }
  185.  
  186. void main()
  187. {
  188. TPar a;
  189. TChl b;
  190. a.p_vvod();|MET.1
  191. a.vivod();|MET.2
  192. b.c_vvod();|MET.3
  193. b.p_vvod();|MET.1
  194. b.vivod();|MET.4
  195. b.TPar::vivod();|MET.2
  196. }
  197.  
  198. Множественное наследование.
  199. TParent1 TParent2
  200. TChl
  201.  
  202. TParent1{};
  203. TParent2{};
  204. class TChl:режим1 TParent1, режим2 TParent2
  205. {};
  206.  
  207. Виртуальное наследование:
  208. Чел
  209. Уч Раб Пенс
  210. УчРаб РабПенс
  211.  
  212. При обычном наследовании класс работающий студент получает 2 комплекта членов класса "человек"
  213.  
  214. Чтобы этого избежать наследование делают виртуально, для этого нужно указать слово virtual перед спецификатором доступа.
Add Comment
Please, Sign In to add comment