Вітаю Сьогодні ми розпочинаємо вивчення однієї з наступних тем об'єкторієнтованого програмування - це успадкування інкапуляцію ми з вами завершили тепер перейдемо до успадкування і почнемо з базових принципів це базове наслідування порядок побудови дочирніх класів та використання ключового слова protected ці ключові теми Нам допоможуть краще зрозуміти е спосіб побудування ієрархії класів та забезпечити більш краще і функціональніше програмування почнемо з базового класу і спадкування що таке взагалі спадкування ну спадкування - це взаємодія між двома класами це коли один клас вспадковує інший клас коли ми маємо можливість використовувати іншим класом точніше його об'єктом якісь елементи того класу який ми вспадкували в спадкуванні єсть декілька видів спадкування це відповідно базове спадкування коли в нас один клас спадковує інший клас єсть також ланцюгове спадкування коли декілька класів між собою взаємопов'язані спадку куванням єсть відповідно множина спадкування коли клас один спадковує декілька батьківських от ми ці всі приклади з вами розберемо покроково почнемо з базового наспадкування базове на спадкування - це коли в нас є один базовий клас його ще називають батьківським наприклад в нас є клас Animal в ньому єсть два метода it і сleep і також є похідний клас або дочірній це той клас який вспадковує наший базовий клас для того щоб зробити спадкування для того щоб сказати що клас Dog спадковує клас Animal ми ставимо до крапки і пишемо Public Animal Таким чином ми з вами реалізовуємо спаткування тобто після назви нашого класу Я ставлю до крапку і роблю вспадкування Public Animal тепер клас Animal являється базовим або батьківським для класу doc що це нам дає тепер коли ми будемо створювати з вами об'єкт класу toк ми матимемо можливість звертатися до відкритих полів батьківського класу точніше базового класу того класу який ми спадкували в нашому класі Animal є методи it і Sleep в класі doc в нас є metметоod Bark давайте подивимося як ми працюємо всередині імеu Ми створюємо з вами об'єкт класу doc називаємо його My Dog викликаємо метод it і Sleep зауважув що it і Sleep в методі точніше в класі doc відсутній Його тут немає але так як ми зробили спадкування класу Animal а в класі Animal є такий метод it і Sleep то безпосередньо ми можемо до нього звертатися так як ми зробили спадкування ці методи являються відкритими зауважуть тільки якщо вони відкритими ми можемо до них звертатися якщо в нас також відкрите спадкування Як бачите наст УТ спадкування при спадкуванні використовується ключове слово па Це означає що ми відкриваємо ну даємо можливість звертатися через об'єкт нашого класу до чірнього до відкритих полів батьківського класу ну і викликаємо тоді методи it і СП батьківського класу ну і далі в кінці викликаємо метод який знаходиться в нашому класі doc ну класі дочірніму вже будемо говорити Давайте скомпілюємо перевіримо компілюємо нашу роботу запускаємо виводимо animal is eating animal is Sleeping dog is barking бачимо що все працює коректно ми викликали з вами методи і теestliп які знаходяться відповідно в класі Animal Якщо ці наші методи будуть вони в полях Private То це означає що ми їх закрили ну і звісно так само будуть працювати ж механізм закриття на Навіть через спадкування навіть якщо Ми створимо об'єкт класу Animal і попробуємо звернутися до цих методів Ми також не зможемо їх до них звернутися і їх викликати те саме буде відбуватися і при спадкуванні якщо ми робимо спадкування і намагаємося через об'єкт класу doc звернутись до метода it і slep відповідно вони в нас закриті ми до них звернутися не можемо от якщо робимо паблі то все працює коректно Ну і також зауважу що не мач важливим є паблік який стоїть під час реалізації спадкування от це реалізація Коли ми ставимо двокрапка пишемо Public і вказуємо ключове слово Animal чому Тому що якщо ми напишемо наприклад Private або protected або взагалі приберемо якщо ми взагалі приберемо то по замовчуванню також буде закрите спадкування а це означає що ми тепер забороняємо доступ через об'єкт нашого дочірнього класу до методів і tlip Точніше коли Ми створимо об'єкт нашого класу doc в intmanні то ми тепер заборонили доступ до таких методів і it Та SP хоча методи і вони і в Палі знаходяться але ми зробили закрите спадкування заборонили доступ через об'єкт дочірнього класу звертатися до методів батьківського класу ну і звісно це ж не забороняє нам створити клас об'єкт класу Animal назвати там О1 і через його об'єкт О1 точка викликати той чи інший метод і чи сleпing тоді там буде працювати Все вірно але через об'єкт дочірнього класу ми не можемо тепер звертатися до і і Сліп Чому Тому що ми зробили закрите спадкування ну і звісно це по замовчуванню в нас е ніяко не стоїть ключового слово тому буде в нас позамовчи в нього закритим якщо Ми додамо ключове слово privт то відповідно працюватиме так так само але ми будемо розуміти Да що в нас закрите спадкування Ми не можемо звертатися до оцих методів які е відмені через об'єкт але ми можемо звертатися до цих методів всередині класу якщо потрібно нам звертатися до цих методів всередині класу це буде не проблема ми пишемо Animal двокрапка двокрапка вибираємо той чи інший метод крапка з комою знов пишемо Animal двокрапка двокрапка Sleep крапка з комою закоментовуємо закоментоємо створення об'єкта класу Animal будемо викликати тільки тоod Bark компілюємо запускаємо dog is barking animal is eating animal is Sleeping тобто всередині класу ми маємо можливі звернутися до цих методів але ззовні через об'єкт до цих методів Ми не маємо можливість звернутися отак працює базове спадкування Тепер давайте перейдемо до ключового слово protected пам'ятаєте на початку нашого курсу я говорив вам що єсть три специфікатора доступу це Private Public і protected Public в нас відповідно відкриває доступ до полів тому що по замовчуванню всі поля класу у нас з'являються закритими і щоб відкрити доступ ми використовуємо Public privт навпаки закриває ми в прайваті зазвичай з вами створюємо змінні Ну а проected в нас використовується для спадкування і Тепер давайте розберемо як же ж він використовується розберемо ще один приклад базового спадкування існує клас gender і існує клас Player в класі gender В нас є в протекі змінна String man woman потім в нас існує клас конструктор gender який приймає відповідно це значення робить ініціалізацію і буде в нас відбуватися виклик виведення що відпрацьовав конструктор також є метод Get people який повертає інформацію про цю змінною далі в нас Class Player Class Player робить повелічте спадкування клау gender в ньому є змінна name і зміна відповідно H також конструктор і Тод print тут ми розберемо як за використовується і protected і побачимо з вами як тут в нас будуть тепер працювати конструктори тому що відповідно в нас єсть також певний порядок тепер виклику конструкторі побудови нашого дочірнього об'єкта якщо ми зробили з вами спадкування от в нас лас gender есть і clла Pair Pair спадкував клас gender то для класу пеера точніше плер наш клас gender являється базовим батьківським і тому там певний буде пріоритет дивимося що відбувається в конструкторі класу Player Ми отримаємо дві змінні name H і плюс змінна яка відповідає за Ganger і далі ми робимо що делегування конструктора хто пам'ятає про делегування конструктора хто ні То можете подивитись в попередніх уроках Я показув вам про делегування конструктора делегування конструктора - це можливість в списковій ініціалізації викликати конструктор Цього ж самого класу якийсь інший або конструктор базового класу і от в списковій ініціалізації ми викликаємо конструктор передаємо значення для того щоб ініціалізувати змінні далі ініціалізуємо свої змінні і виводимо що відпрацював конструктор нашого класу Play ще раз наголошую для того щоб нам можливість дати ініціалізувати дані Men Woman ми будемо використовувати конструктор делегування конструктора базового класу чому Тому що ми тепер в інmanні будемо працювати через об'єкт класу Player і і всю інформацію будемо класти через об'єкт класупer Тобто ми будемо передавати ім'я передавати вік І передавати гендер відповідно ім'я і вік Ми повинні з вами покласти Так перепрошую в нас повітряна тривога одну хвилинку продовжуємо і так а ми повинні з вами передати ім'я і вік передаємо ці ім'я і вік в клас плер для того що тому що в нас тут є ці змінні name і H ми повинні їх ініціалізувати ці змінні а змінну мен точніше інформація про нer і наше слово ми повинні передати конструк в клас gender тому що він собі зберігає цю інформацію і він має таку зміну яка може зберігати цю інформацію а так як ми передаємо всю цю інформацію через об'єкт класу Player відповідно його конструктор повинен прийняти цю інформацію тому тут три змінні name Age і people далі ми повинні ініціалізувати name і H свої змінні покласти туди інформацію і якимось чином передати оцеймен для нашого базового класу І от ми ци робимо за допомогою е-е списку ініціалізації і делегування конструкторів за допомогою цього делегування ми передаємо цю інформацію в нашій відповідно клас gender чому так відбувається тому що коли Ми створюємо об'єкт нашого класупр То тепер уявляємо собі що він складається з двох частинок він складається з частини свого класу і з частини базового класу тобто він має можливість тепер використовувати всі весь функціонал і свого класу і базового класу якщо там відповідно в нас є доступ до нього і нам вже треба тепер і мати можливість якось працювати з конструктором класу плер свого класу і якось мати можливість працювати з конструктором базового класу ну і відповідно тепер в першу чергу в нас буде викликатися цей конструктор потім в нас відповідно делегування конструкторів викликається і ми робимо спискову ініціалізацію і потім подивимося де в нас в фігурних дужках буде перше відпрацьовувати код для початку ми методи виводити не будемо просто скомпілюємо роботу запускаємо дивимося Як в нас відпрацьовують наші конструктори навіть якщо тут в нас є от виклик делегування конструкторів і ми передаємо туди інформацію але завжди потрібно пам'ятати коли ми маємо базове спадкування коли в нас є дочірній клас і базовий клас батьківський в першу чергу завжди буде виконуватися батьківський клас я покажу вам на наступному прикладі щоб ви це бачили більш детальніше в першу чергу буде виконуватись наший базовий клас Навіть якщо ми не будемо робити от передачу цієї інформації не будемо робити делегування Ми знов скомпілюємо двокрапку забули поставити повертаємо двокрапку компілюємо повторно запускаємо в нас завжди все ж таки буде викликатися в першу чергу точніше виконуватись виконуватись те що знаходиться в фігурних дужках те що знаходиться всередині фігурних дужках нашого конструк воно буде в першу чергу виконуватися в базовому конструкторі а потім тільки в дочірньому конструкторі Тобто ми створили об'єкт передали інформацію у нас викликається цей конструктор Він отримує інформацію далі відпрацьовує спискова ініціалізація потім наступним кроком викликається цей конструктор він можливо також свою спискову ініціалізацію виконує потім заходить всередину фігурний дужок свого конструктора виконує ту дію яку ми тут про писали далі ми повертаємося назад до конструктора дочірнього класу Заходимо в середину фігурнидужок і виконуємо наступну дію яку ми тут Прописали От такий порядок порядок буде починатися виконання конструктора виконання - це те що всередині фігурний душок ми написали з базового до дочірнього з базового до дочірнього але спискова ініціалізація відповідно буде відбуватися з дочірнього до базового ну і звісно нам треба передати якусь інформацію це ми робимо за допомогою оцього делегування конструктор передаємо people в базовий клас Він отримує це значення потім робить ініціалізацію потім виводимо інформацію повертаємося назад доініціалізовуємо в спискові ініціалізації змінну name і H заходимо всередину і виводимо те що написано тут всередині От такий порядок буде роботи Тепер давайте подивимося як в нас викликаються методи print і Get people print і Get people Get people в нас знаходиться всередині класу gender а print знаходиться всередині класу Player і тепер якраз ми звертаємо вашу увагу на protected ключове слово бачимо що всередині базового класу всередині базового класу gender нас man woman знаходиться під специфікатором доступу protected для чого це якщо ми подивимося на метод print всередині класу Player то ми бачимо що ми виводимо name виводимо Age і виводимо man woman тому для того щоб мати можливість звертатися до змінної яку Зазвичай ми закриваємо за допомогою специфікатора доступа privт всередині дочірнього класу ми змінюємо privт на protected то protected нам дає можливість використовувати всі поля які знаходяться під цим специфікатором доступу всередині дочірнього класу але не через об'єкт зауважую не через об'єкт воно працює так само для об'єктів як privт через об'єкт до цих значень які знаходяться в прайті і протекту ми не можемо звертатися але якщо якісь поля або змінні базового класу знаходяться під ключовим словом protected От наприклад змінна manw то ми можемо до неї звертатися в всередині всередині дочірнього класу того класу який робить спадкування от наший клас PR він робить спадкування І тому ми можемо тепер звернутися до цієї змінної manwom ми зараз використаємо метод print скомпілюємо і подивимося компілюємо роботу запускаємо виводиться що відпрацювали констру руктори далі Антон 25 імен все відпрацювало коректно давайте подивимося що буде якщо я напишу privт зберегли бачимо що в нас виникає помилка ми бачимо що тепер підкреслюється Man womom чому Тому що prпраivт - це prпраivт Приватна зміна - це тільки зміна доступна буде тільки всередині цього класу за межами класу через об'єкт звернутись не можемо в дочірньому класі звернутись не можемо через об'єкт дочірнього класу звер не можемо то ця зміна повністю в нас привадна і до неї ми можемо звертатися тільки всередині класу тільки всередині класу там де ця зміна у нас створена ну відповідно в конструкторі і в інших методах які ми реалізуємо а за межами навіть в спадкуванні не можемо Та є інколи необхідність от як в нашому прикладі щоб мати можливість звертатись до цієї змінної всередині класу пе всередині класу дочирнього тому тоді таку зміну Ми змінюємо з Private на protected а прокed дає нам можливі звертатися до такої змінної всередині дочірніх класів і ми маємо можливість тоді це робити Отак воно працює компілюємо повторно запускаємо все відпрацьовує коректно Оце і є застосування нашого базового спадкування з використанням ключового слово protected Ну і плюс Я показав вам який же порядок буде виклику конструкторів і нагадав що таке делегування конструкторів делегування конструкторів - це виклик структора або цього класу або базового класу для передачі якихось інформації давайте тепер розберемо порядок побудови цих же ж класів дочірніх і тут продемонструю вам тепер не базове спадкування не одиночне спадкування а ланцюгове спадкування коли в нас декілька класів і вони між собою взаємопов'язані спадкуванням наприклад в нас є от клас А сть клас Б який вспадковує клас А єсть клас с який вспадковує клас B і є клас D яки спадковує клас с тобто такий ланцюг для класу D в нас буде базовий C B і a а але по ієрархії а буде самий вищий потім наступний B потім c і так для кожного нашого класу от таке ланцюгове спадкування в нас a являється самим самим верхнім по ієрархії спадкування буде самим базовим потім в нас клас B спадковує клас a відповідно для нього є базовий це a для класу C буде базовий нас B і a але по саме вище по ієрархії спадкування буде a і потім нас так само і дій буде і тепер ми повинні з вами зрозуміти в якому же ж порядку в нас будуть викликатися конструктори пам'ятаєте з попереднього прикладу який тільки що показував вам говорив що в нас єсть порядок виклику конструкторів починаючи від самого базового до дочірнього від самого верхнього по ієрархії до самого нижнього по ієрархії спадкування давайте Ми створимо наприклад об'єкт класу a Подивимося як для нього відпрацює цей код Ну і подивимося що викличеться для створення цього об'єкта викликаємо конструктор а вводимо конструктор відповідно вивели А ми створили об'єкт класу a викликається його конструктор і тут конструктор виводи відповідно тільки змінну А так як спадкування для нього немає то відповідно в нього тільки буде один конструктор давайте Ми розкоментуємо створимо об'єкт класу B клас B в нас спадковує клас А відповідно там може бути Щось по-іншому компілюємо повторно запускаємо виводимо конструктор а для для нашого об'єкта давайте можемо закоментуємо будемо виключно виводити тільки ту інформацію яка нам потрібна компілюємо повторно виводимо конструктор B конструктори для класу B створюємо об'єкт класу B виводиться a і вводиться B тобто коли ми створиюємо об'єкт класу B Він має спадкування класу а відповідно для нього клас А є базовим класом і по схемі яку ми бачимо з вами по виведені ми бачимо що для поча спочатку в нас виконується конструктор класу базового a а потім конструктор класу B так в насце залежить від от побудови спадкування і така ієрархія виклику конструкторів починаючи від самого базового до дочірнього так як в нас тільки клас B в спадковий клас a то відповідно для нього для класу B клас А буде один базовий клас ми будемо виконувати його конструктор а потім будемо виконувати цей конструктор тепер не складно здогадатися як же ж ми будемо викликати конструктори для класу C коли Ми створюємо об'єкт класу C клас C В нас випадковує клас B тобто для нього він являється базовим але в свою чергу клас B в спадкови клас a І от в саме верхній базовий тобто клас C має два базових класи по ланцюгові спадкуванні по ланцюговому спадкуванні це клас B і клас A клас a являється самим верхнім по ієрархії спадкування клас B не являється наступним Ну і далі відповідно клас C якщо Що подумати з попередніх прикладів То тепер ми можемо з вами спрогнозувати що виклик конструкторів буде відбуватися починаючи з самого верхнього до самого нижнього це в нас буде A B і потім C самий верхній базовий потім наступний базовий і потім відповідно об'єкт за допомогою той клас і той конструктор за допомогою якого був створений наш об'єкт наш об'єкт був створений за допомогою класу C Ну і на останок Давайте перевіримо Цю ж схему на на створення об'єкта класа D клас D в спадковує нас клас C клас C в спадковий клас B клас B впадковий клас a Ну і ми тепер знаємо що в цьому порядку спадкування в нас нас самий верхній базовий клас - це клас a потім клас B потім клас C а потім клас D тобто коли Ми створюємо об'єкт класу D і маємо такий ланцюг спадкування то в першу чергу у нас буде виконуватись конструктор класу a потім конструктор класу B потім конструктор класу C а потім конструктор класу D а в останню чергу буде виконуватись конструктор цього класу нагадаю що що значить виконуватись це те що ми Прописали всередині фігурних дужок це те що ми Прописали всередині фігурних дужок деструктори пам'ятаємо що деструктори також автоматично викликаються при знищенні об'єкта і деструктори у нас будуть викликатися в протилежному напрямку починаючи з КСУ D потім C потім B потім a Оце і є в нас відповідно порядок побудови дощірніх класів і от ланцюгове спадкування і Відповідно ми бачимо що як тут в нас викликаються конструктори при такому виді спаткування давайте повторимо все з самого початку і так ми з вами сьогодні розібрали що таке взагалі вспадкування це взаємодія між двома класами ро розібрали з вами базове на спадкування базове спадкування це в нас відповідно А коли єсть або базове або одиночне це в нас коли єсть один базовий клас і єсть відповідно один дочірній клас наприклад клас Animal був базовим клас Dog В нас був дочірнім для того щоб зробити спадкування після назви нашого класу Док ми ставимо двокрапка використовуємо ключове слово за допомогою якого ми будемо робити спадкування відповідно це ключове слово це специфікатор він буде визначати яке ми матимемо спадкування або відкрите або закрите якщо ні жодне нема якщо ні жодного нема то по замовчуванню у нас буде закрите спадкування відповідно частіше завжди виконуємо використовуємо ми па для того щоб в нас було відкрите спаткування для того щоб ми мали можливість звертатися до відкритих полів батьківського класу далі ми розібрали що таке ключове слово protected це специфікатор доступу який надає нам можливість звертатися до полів ід специфікатором protected всередині дочірнього класу от ми з вами виводили тут змінну man woman всередині дочірнього класу Player і так само подивилися як наш відпрацьовують конструктори викликається конструктор отримується значення робимо делегування конструктору передаємо дані в базовий клас потім ініціалізуємо свої в нас отримується значення відбувається ініціалізація базового класу і виводиться відповідно та інформація або виконується те що ми написали всередині базового класу а потім аж повертаємося всередину до чі нього конструктора і виконуємо ту дію яку ми тут написали тут ми просто виводили якусь інформацію і розглянули на кінець це побудування дочірніх класів коли в нас ланцюогове спадкування ми ще раз пересвідчились в якому ж порядку в нас викликаються конструктори конструктори будуть викликатись нас від самого базового до похідного От так працює наше спадкування це тільки вступна частина до ее вивчення спадкування в c++ далі буде в нас ще інші теми які не менш важливі будуть для того щоб зрозуміти принцип роботи спадкування на цьому все Бажаю успіху і до наступної зустрічі