inheritance c
Важливість успадкування в C ++ з прикладами:
Спадкування - одна з найважливіших особливостей об’єктно-орієнтованого програмування.
Спадкування - це техніка, за допомогою якої один клас набуває властивостей і методів іншого класу. Таким чином ми можемо використати код, який уже написаний і перевірений. Клас, який набуває властивостей іншого класу, називається підкласом або похідним класом або дочірнім класом.
Клас, властивості якого набуваються, називається базовим класом або батьківським класом або суперкласом. Коли один клас набуває або успадковує інший клас, тоді всі властивості та методи базового класу доступні для похідного класу, щоб ми могли використовувати цей код повторно.
=> Завітайте сюди, щоб вивчити C ++ з нуля.
c програмування запитань та відповідей на інтерв’ю pdf
Що ви дізнаєтесь:
- Навіщо нам спадщина?
- Режими успадкування
- Порядок конструкторів / деструкторів у спадщину
- Види успадкування
- Спадщина шаблону
- Склад
- Як слід вирішувати між складом та спадщиною?
- Висновок
- Рекомендована література
Навіщо нам спадщина?
Розглянемо групу транспортних засобів, таких як автомобіль, автобус, джип тощо. Кожен із цих транспортних засобів матиме властивості та методи, як зазначено на діаграмі нижче.
Якщо від нас вимагають реалізації окремих класів для вищезазначених транспортних засобів, ми можемо побачити, що у всіх трьох класах нам доведеться писати той самий код, що і всі три типи транспортних засобів, які більш-менш мають однакові властивості. Це зробить нашу програму неефективною та громіздкою, оскільки буде багато повторюваних кодів.
Замість того, щоб писати дубльований код, як описано вище, ми можемо реалізувати функцію успадкування, щоб запобігти дублюванню коду, а також написати один шматок коду і використовувати його у всіх трьох класах. Це зображено на малюнку, як показано нижче.
На наведеному малюнку ми визначили базовий клас “Транспортні засоби” та вивели з цього класу класи Автомобіль, Автобус та Джип. Поширені методи та властивості є частиною класу Транспортні засоби зараз. Оскільки інші класи походять від класу Vehicles, всі класи набувають цих методів та властивостей.
Отже, нам просто потрібно написати загальний код лише один раз і всі три класи; Його придбають автомобіль, автобус та джип.
Таким чином, основною перевагою, яку ми отримуємо шляхом успадкування існуючих класів або проектування механізму успадкування, є багаторазове використання коду.
Подальше читання = >> Підручник з успадкування Java
Загальний формат успадкування класу:
class derived_classname: access_specifier base_classname { };
Тут “ похідне_класне ім'я '- це назва похідного класу,' специфікатор_доступу '- це режим доступу, тобто загальнодоступний, захищений або приватний, в якому похідний клас повинен успадкувати базовий клас і' похідне_класне ім'я ”- це ім’я базового класу, від якого успадковується похідний клас.
Режими успадкування
“Access_specifier”, показаний у наведеній вище декларації про успадкування, може мати свої значення, як показано нижче.
Залежно від специфікатора доступу, вказаного під час успадкування класу, ми маємо різні режими успадкування, як зазначено нижче.
Громадське спадкування
Загальний синтаксис
class sub_class : public parent_class
Коли вказано специфікатор загального доступу, загальнодоступні члени базового класу успадковуються як загальнодоступні, тоді як захищені члени захищені. Приватні члени залишаються приватними. Це найпопулярніший спосіб успадкування.
Приватна спадщина
Загальний синтаксис
class sub_class : parent_class
Приватна спадщина нічого не успадковує. Коли використовується специфікатор приватного доступу, відкриті та захищені члени базового класу також стають приватними.
Захищена спадщина
Загальний синтаксис
class sub_class:protected parent_class
Коли використовується специфікатор захищеного доступу, відкриті та захищені члени базового класу стають захищеними членами похідного класу.
Зверніть увагу, що коли ми використовуємо специфікатор приватного доступу для базового класу, жоден з членів базового класу не успадковується. Усі вони стають приватними у похідному класі.
Нижче наведено табличне представлення всіх режимів доступу та їх інтерпретація для успадкування.
Похідний клас -> Базовий клас | Приватна | Громадський | Захищений |
---|---|---|---|
Приватна | Не передається у спадок | Не успадковується | Не успадковується |
Громадський | Приватна | Громадський | Захищений |
Захищений | Приватна | Захищений | Захищений |
Порядок конструкторів / деструкторів у спадщину
Коли класи успадковуються, конструктори викликаються в тому ж порядку, що і класи. Якщо у нас є базовий клас і один похідний клас, який успадковує цей базовий клас, тоді спочатку буде викликаний конструктор базового класу (незалежно від того, чи параметризований), а потім похідний конструктор класу.
Наступна програма демонструє порядок конструкторів у спадкуванні. У нас є базовий клас “Base”, який має конструктор за замовчуванням та параметризований конструктор. З цього класу ми отримуємо клас, який називається “Виведений”, який також має один за замовчуванням та інший параметризований конструктор.
Результат роботи цієї програми показує порядок виклику конструкторів.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Вихід:
Конструктор за замовчуванням базового класу
Конструктор за замовчуванням базового класу
Похідний конструктор класу за замовчуванням
Параметризований конструктор базового класу
Виведений параметризований конструктор класу
Ми бачимо, що після створення об'єкта базового класу ми створюємо похідний об'єкт класу з конструктором за замовчуванням. Коли цей об'єкт створюється, спочатку викликається конструктор базового класу за замовчуванням, а потім виконується конструктор похідного класу.
Подібним чином, коли похідний об'єкт класу створюється за допомогою параметризованого конструктора, спочатку викликається параметризований конструктор базового класу, а потім викликається конструктор похідного класу.
Зауважте, що якби в базовому класі не було параметризованого конструктора, тоді конструктор за замовчуванням був би викликаний навіть для побудови параметризованого похідного об’єкту класу.
Але залишається питання, чому конструктор базового класу викликається під час побудови похідних об’єктів класу?
Ми знаємо, що конструктор використовується для створення об'єктів класу, а також для ініціалізації членів класу. Коли створюється похідний об'єкт класу, його конструктор має контроль лише над похідними членами класу.
Однак похідний клас також успадковує члени базового класу. Якби був викликаний лише конструктор похідного класу, тоді члени базового класу, успадковані похідним класом, не були б ініціалізовані належним чином.
Як результат, весь об’єкт не буде створений ефективно. Це причина, з якої всі конструктори базового класу викликаються першими, коли створюється похідний об'єкт класу.
Види успадкування
Залежно від способу виведення класу або скільки базових класів успадковує клас, ми маємо такі типи успадкування, як показано на малюнку нижче.

Ми розглянемо кожен із цих типів у наступному навчальному посібнику “Види успадкування”.
Спадщина шаблону
Коли наша реалізація включає шаблони, тоді нам потрібно успадкувати або вивести з класів шаблонів, і ми використовуємо там успадкування шаблонів.
тестування веб-сервісу з використанням запитань на співбесіду soapui
Перейдемо безпосередньо до Прикладу програмування, щоб краще зрозуміти успадкування за допомогою шаблонів.
#include using namespace std; //template inhertance templateclass basecls_Template { public: T value; basecls_Template(T value) { this->value = value; } void displayVal() { cout << value << endl; } }; //derived class inherits basecls_Template class derivedcls_Child : public basecls_Template { public: derivedcls_Child(/* no parameters */): basecls_Template( 0 ){ // default char is NULL; } derivedcls_Child(char c): basecls_Template( c ) { ; } void displayVal_drvd() { displayVal(); } }; int main() { basecls_Template obj( 100 ); derivedcls_Child obj1( 'A' ); cout<<'basecls_Template obj = '; obj.displayVal(); // should print '100' cout< Вихід:
basecls_Template obj = 100
похіднийcls_Child obj1 (успадкований від basecls_Template = A
У наведеній вище програмі ми маємо шаблон з назвою basecls_Template, який визначає шаблон класу для базового класу. Далі ми визначаємо клас, отриманийcls_Child, який ми хочемо отримати з класу шаблону.
Але зверніть увагу, що клас basecls_Template - це лише тип, а не клас. Отже, ми не можемо отримати клас, отриманийcls_Child з цього шаблону.
Тому, якщо ми оголосимо дочірній клас як:
class derivedcls_Child : public basecls_Template
Це призведе до помилки. Причиною того, що basecls_Template є тип даних, а не клас. Таким чином, для того, щоб успадкувати члени basecls_Template, нам слід спочатку створити його за допомогою екземпляра, перш ніж виводити з нього.
Тому вищезазначене твердження, Клас, отриманийcls_Child: public basecls_Template працює нормально.
У цьому твердженні ми створили інстанцію шаблону basecls_Template до шаблону класу символів. Як тільки ми використовуємо цей примірник класу шаблону, тоді інші речі, такі як створення та використання об'єктів, збігаються із звичайною роботою успадкування.
Склад
До цього часу ми бачили все про спадкові відносини. Спадщина в основному зображує тип відносин, в яких відносини вказують на частину. Наприклад, змія - це свого роду рептилія. Можна також сказати, що Рептилія є частиною класу Тварин.
На закінчення слід зазначити спадщина 'Є' такі відносини, в яких можна сказати, що похідний клас є частиною базового класу.
Ми також можемо представляти стосунки в цілому. Наприклад, якщо ми говоримо, що клас заробітної плати є частиною класу Employee, то ми не представляємо його належним чином. Ми знаємо, що працівники мають зарплату. Таким чином, зручніше говорити «Працівник має зарплату».
Подібним чином, якщо взяти за приклад клас Vehicles, можна сказати, що Vehicle has Engine або Vehicle has chass. Таким чином, усі ці відносини зображені 'МАЄ' відносини, що представляють цілий об'єкт, що міститься в іншому класі. Це визначається як Склад .
Відносини, зображені композицією, залежать один від одного. Наприклад, шасі не може існувати без транспортного засобу. Так само заробітна плата не може існувати без працівника.
Ми можемо представити композицію схематично, як показано нижче:

Композиція також називається Утримання. У наведеному вище поданні ми показали батьківський клас. На відміну від успадкування, ми включаємо об’єкт дочірнього класу всередину батьківського класу. Це стримування або композиція.
що таке .swf файл
Візьмемо приклад програмування, щоб зрозуміти це.
#include using namespace std; //Composition example //Child class - address class Address { public: string houseNo, building, street, city, state; //Initialise the address object Address(string houseNo,string building,string street, string city, string state) { this->houseNo = houseNo; this->building = building; this->street = street; this->city = city; this->state = state; } }; //Parent class - Employee class Employee { private: Address* address; //composition->Employee has an address public: int empId; string empName; Employee(int empId, string empName, Address* address) { this->empId = empId; this->empName = empName; this->address = address; } void display() { cout< Вихід:
10001 Вед
A-101 Срібні джерела Aundh Pune Maharashtra
У цьому прикладі ми маємо батьківський клас Employee та дочірній клас Address. Усередині батьківського класу Employee ми оголосили вказівник на клас Address, а також ініціалізуємо цей об'єкт у конструкторі Employee. Таким чином, ми зображуємо відносини, що працівник має адресу, яка є складом.
Як слід вирішувати між складом та спадщиною?
Композиція та спадщина відображають відносини між класами. У той час як спадщина зображує взаємозв'язок 'IS-A', композиція - відносини 'HAS-A'.
Тепер питання в тому, що коли ми повинні використовувати спадщину, а коли - композицію? Насправді, ми не можемо визначитися з точними ситуаціями, як коли ми повинні використовувати будь-яку з них. Це тому, що кожен має свої переваги та недоліки.
Обидва сприяють повторному використанню коду. Спадщина може зробити код масовим, оскільки рішення ускладнюються, але в той же час це також дозволяє нам розширити існуючий код. Таким чином, ми повинні використовувати успадкування, коли наша вимога полягає у зміні та використанні властивостей та методу іншого класу всередині нового класу.
Іншими словами, коли ми хочемо додати більше властивостей і розширити існуючий клас. З іншого боку, коли ми не хочемо змінювати властивості та поведінку іншого класу, а просто використовуємо його всередині класу, ми переходимо до композиції.
Таким чином, найкраще рішення полягає в тому, чи використовувати композицію чи спадщину буде прийнято шляхом зважування плюсів і мінусів обох методів для конкретної ситуації.
= >> Також прочитайте Composition in Java
Висновок
Таким чином, ми підійшли до кінця нашої теми про спадкування. Ми бачили різні способи успадкування. Ми також бачили типи успадкування, які ми розглянемо у наступному підручнику. Ми дізналися про порядок конструкторів, які виконуються у разі успадкування.
Ми також вивчали шаблони та спадщину. Нам потрібно створити екземпляр шаблону, перш ніж ми зможемо використовувати його для успадкування, оскільки сам шаблон є типом даних, і ми не можемо успадкувати від типу даних.
Композиція - це інший тип класових стосунків, і нам спочатку потрібно знати точну ситуацію, а потім лише ми можемо вирішити, використовувати композицію чи спадщину.
У нашому майбутньому підручнику ми побачимо більше про типи успадкування.
=> Зверніть увагу на прості навчальні серії C ++ тут.
Рекомендована література
- Типи успадкування в C ++
- Поліморфізм виконання в C ++
- Функції друзів в C ++
- Використання класу Selenium Select для обробки випадаючих елементів на веб-сторінці - Підручник селену №13
- Класи та об'єкти в C ++
- Статична в C ++
- Підручник з труб Unix: Труби в програмуванні Unix
- Інтерфейс Java та підручник з абстрактних класів із прикладами