Transcript for:
Основи успадкування в програмуванні

Вітаю ми продовжиємо з вами розбирати успадкування і Сьогодні ми розглянемо перевизначення методів батьківського класу та множина спадкування що таке перевизначення методів батьківського класу це можливість яка допомагає нам реалізувати такий же самий метод який знаходиться всередині батьківського класу всередині дочірнього класу та відповідно реалізувати з певними змінами щоб можливо такий метод працював по-іншому чим у батьківському класі уявімо собі що в нас з вами от є клас parent він являється батьківським класом і клас Child який являється дочірнім класом середині класу parent в нас реалізований методш якщо Ми створимо об'єкт класу Child і попробуємо викликати з вами метод Show то в нас буде викликатися метод Show батьківського класу але зазвичай ми звісно дивимося в першу чергу всередину дочірнього класу чи існує там такий метод якщо такого метода не існує то Відповідно ми потім дивимося всередину батьківського класу чи існує цей методш компілюємо запускаємо виводимо відпрацював метод класу parent Show але при перевизначенні Нам потрібно буде з вами реалізувати такий же самий метод Тільки тепер всередині класу Child І наприклад замінити що в нас буде відпрацьовуватись клас Child тепер коли ми будемо викли Кати metтоod Show буде викликатися metметоod Show всередині класу Chat для об'єкта Chat для об'єкта This is Child Class все подібно до перевантажених функцій коли певна функція працювала з певним типом даних так само і в нас chт він являється відповідно певним типом даних якщо в ньому існує такий методш ми будемо викликати через об'єкт методш для clлаі Child якщо такого метода існувати не буде то ми будемо дивитися всередину батьківського класу Можливо по ієрархії там вище будемо також спостерігати чи існують ці методи але будемо викликати той найближчий метод який єсть в батьківському класіш Звісно це ніяким чином не впливає на роботу з об'єктом класу parent якщо ми працюємо з об'єктом класом parent і викликаємо для цього об'єкта od Show то у нас буде викликатися метод Show класу parent скомпілюємо перевіримо запускаємо виводиться що відпрацював клас parent для об'кта нашого класу parent і виводиться що відпрацював метод Child для об'кта класу і це є перевизначення методів батьківського класу ко ми реалізовуємо такий же самий метод по прототипу тип повертаємо значення ім'я аргументи якщо функція щось приймає метод щось приймає і реалізовуємо його наприклад в дочірніх класах ми перевизначаємо метод батьківського класу так працює перевизначення Ну звісно ми всередині такого методу можливо реалізуємо якийсь інший алгоритм дій оце основне що стосується при перевизначенні методів батьківського класу коли воно актуальне коли ми працюємо наприклад з багатьма класами коли в нас реалізоване ланцюгове спадкування і ми хочемо от мати можливість працювати з якимось методом наприклад там метод Get count Або можливо метод print для того щоб не реалізовувати будь-яких похідних класах metтоodпint ми можемо реалізувати методпint в батьківському класі і потім викликати в батьківському класі але якщо вам потрібно зробити виведення Зовсім по-іншому то ви такий методпint можете перевизначити в іншому дочірньому класі і коли будете працювати з об'єктом дочірнього класу і викликати метоodпint то буде викликатись metметодпint який реалізований всередині цього класу а для всіх інших похідних класів буде викликатися метод батьківського класу Оце і є перевизначення методів батьківського класу Як говорив це не складно буде для зрозуміння головне просто запам'ятати який механізм тут відбувається тепер перейдемо Давайте до множинного спадкування множинна спадкування це в нас коли один дочірний клас має декілька батьківських класів в нас є клас Animal і єсть клас Bird і відповідно єсть клас FD клас animal- базовий Клас Клас Bird - ще один базовий клас в класі Animal єсть метод в класі Bird естьсть метод чиip відповідно в класі В нас є метод mimic і класперед нас спадковує клас Animal і Bird Public Animal Public Bird зауважу що порядок спадкування також впливає яким чином на порядок виклику конструкторів якщо ми з вами спадкували спочатку клас Animal то відповідно в нас буде вкликатись конструктор якщо він тут існує класу Animal в першу чергу а потім буде викликатися конструктор класу Bird так як це два базових класи для класу parent відповідно конструктори будуть викликатися першими їхніми в порядку спаткування а потім буде викликатись конструктор класу Окей що це нам дає коли в нас є ба множина спадкування коли в нас один клас спадковує декілька базових класів ми можемо тепер використовувати всі внутрішні дані цих обох базових класів створюємо в імені об'єкт класуперет називаємо його т поі викликаємо всі ці методи викликаємо метод speakк викликаємо метод IP викликаємо метод imic через об'єкт класу перед через об'єкт класу дочірнього скомпілюємо запускаємо тварина говора пташка щебече папуга імітує все працює коректно це і в нас є множина спадкування але також треба пам'ятати що інколи може траплятись ситуація коли наші класи і Anal вспадковують також якийсь інший клас наприклад клас a напишемо що в класі a в нас буде змінна змінна а впраті буде просто крап з комою і тепер ми робимо спадкування для класу Animal A зараз дивлюся помилки вникла чудово і Public a для класу bir що в нас відбулося В нас є самий верхній базовий клас A клас Animal спадковує в нас А клас A клас Bird також спадковує клас a а потім в свою чергу в нас відбувається спадкування класу рот який вспадковує clлаass Animal і Class Bird щоб схематично показати вам як це відпрацьовує покажу вам на Paint Online от в нас існує клас a це в нас клас Animal це в нас клас для А це в нас Клас parot Клас Animal спадковий клас aклас Bird спадковує клас a лас Per спадковує клас Animal і Bird виходить таке ромбовидне спадкування коли клас parot має можливість звертатися до класу a з двох сторін по двох напрямках і в ньому наприклад існує в класі a змінна value ми хочемо з вами звернутися до цієї змінної давайте реалізуємо метод Get Public або не буду реалізовувати А ні Get ні Private не напишу просто змінну покладемо Public так буде легше для розуміння побачити В чом тут проблема буде виникати тепер ми пишемо parot двокрапка двокрапка і довертаємося до змінної і хочемо її вивести STD C Out STD nкра вея в нас в пабліку в пабліку есть inвеia А через крапку Перепрошую через крапку ми поки кажу просто що ми маємо доступ до такої змінної наприклад от методи методи методи методи і потім змінна вель ми вибираємо змінну вель і хочемо тепер з нею взаємодіяти вивести наприклад інформацію або покласти тут ми спочатку повинні були покласти її щось а потім виводити тому що вивести не буде Що Ну наприклад покласти а потім вивести ніби Проблем не повинно бути ми маємо доступ до такої змінної ми робимо спадкування ромбовидне маємо відповідно можливість звертатися до цієї зміної через клас Animal або Bird через об'єкт класу перед та виникає якась проблема пишемо пише що parot valia не являється однозначним Що це значить це означає що коли ми з вами маємо таке ромбовидне спадкування то насправді воно не зовсім робовинне В нас немає такої структури в нас з вами для коложного для кожного класу Animal та Bird будується своя копія класу A бо я копія тобто в кожного класа Animal в класа Animal і Bird є свій клас a а так як нас клас д спадковий кла Animal і clла Bird то відповідно що ми тепер маємо доступ до двох копій класу a і в кожному класі A В нас є змінна val value і там є і там є І це відбувається що от проблема з неоднозначністю що компілятор не знає до якої змінної велюї нам звернутися чи до змінної велі класу a через цей напрямок чи до змінної класу V через цей напрямок от виникає така проблема це коли в нас з вами відбувається ромбовидне спадкування щоб також в нас щоб уникнути такої помилки нам потрібно з вами зробити віртуальне спадкування ми про віртуал і поліморфізм будемо знайомитись Наступного разу але от дану проблему також можна Уни вникнути використовуючи віртуальне спадкування це коли ми з вами будемо наприклад спадковувати не просто Public а пишемо Virtual Public Virtual Public коли ми будемо вспадковувати віртуально клас a це дає нам змогу з вами зробити оце одне ромбовидне спаткування коли в нас буде один екземпляр класу a для класу Animal і для класу Bird і тоді яка проблема В нас зникне дивимося в intmain помилка в нас зникла можемо перекомпіляти перекомпілювати подивитися запускаємо і вводимо значення 10 тепер працює все коректно крім рішення проблеми через віртуальне спадкування ми могли б зробити і інше рішення наприклад статична змінна статична змінна - це змінна яка в нас в одному екземплярі існує і доступна для всіх об'єктів нашого класу якщо ми б зробили таку статичну змінну як val то проблеми також не було б вона була б одна для всіх об'єктів вашого класу і відповідно б вона була б в одному екземплярі і ми могли б потім до неї звертатися через CL parot і з нею взаємодіяти тому важливо також пам'ятати що коли ми маємо з вами от множина спадкування коли в нас існує один дочірній клас який вспадковує декілька ба ських класів а вони в свою чергу вспадковують якийсь один також клас То може виникнути от подібна проблема цю проблему в нас можна вирішити використовуючи віртуальне спаткування або статичні зміни на цьому все бажаю вам успіху і до наступної зустрічі