types inheritance c
Дослідіть усі типи успадкування в C ++ на прикладах.
У нашому попередньому підручнику ми дізналися про успадкування в C ++. Залежно від способу виведення класу або кількості базових класів, які успадковує клас, ми маємо такі типи успадкування:
- Одиночне успадкування
- Множинне успадкування
- Багаторівневе успадкування
- Ієрархічне успадкування
- Гібридне успадкування
=> Дивіться тут, щоб ознайомитися з повним списком підручників з C ++.
Що ви дізнаєтесь:
Види успадкування
Нижче наведено наочне зображення різних видів спадкування.
Ми побачимо кожен тип успадкування з прикладами в наступних розділах.
# 1) Одиночне успадкування
При одиночному успадкуванні клас походить лише від одного базового класу. Це означає, що існує лише один підклас, який походить від одного суперкласу.
Одиночне успадкування зазвичай оголошується таким чином:
class subclassname : accessspecifier superclassname { //class specific code; };
Нижче наведено повний приклад одиночного успадкування.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< Вихід:
Собака має 4 ноги
У собаки 1 хвіст
Собачий гавкає !!!
У нас є клас Animal як базовий клас, з якого ми отримали собаку підкласу. Клас собака успадковує всіх членів класу Animal і може бути розширений, включаючи власні властивості, як видно з результату.
Одиночне успадкування - найпростіша форма спадкування.
# 2) Множинне успадкування
Множинне спадкування зображено на малюнку нижче.
Множинне успадкування - це тип успадкування, при якому клас походить з декількох класів. Як показано на наведеній вище схемі, клас C - це підклас, для якого батьківським є клас A та B.
За реальним сценарієм дитина успадковує від батька та матері. Це можна розглядати як приклад багаторазового успадкування.
Ми представляємо наведену нижче програму для демонстрації множинної спадщини.
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
Вихід:
Введіть номер рулону: 25
Введіть дві найвищі оцінки: 40 50
Введіть позначку для спільної навчальної діяльності: 30
No рулону: 25
Всього оцінок: 120
Середня оцінка: 40
У наведеному вище прикладі ми маємо три класи, тобто студентські позначки, спільні навчальні позначки та результат. Клас student_marks читає позначку предмета для учня. Клас cocurricular_marks читає оцінки учня під час спільної навчальної діяльності.
Клас Результат обчислює загальні_знаки для студента разом із середніми оцінками.
У цій моделі клас Result походить від знаків_учня та спільних навчальних_міток, оскільки ми обчислюємо результат за предметом, а також за оцінками спільної навчальної діяльності.
Це демонструє безліч спадкоємств.
Алмазна проблема
Алмазна проблема зображена нижче:
основні запитання та відповіді на співбесіду з питань технічної підтримки
Тут у нас є дитячий клас, який успадковує два класи - батько та мати. Ці два класи, у свою чергу, успадковують клас Людина.
Як показано на малюнку, клас Дитина успадковує риси класу Людина двічі, тобто один раз від батька, а другий раз від матері. Це породжує неоднозначність, оскільки компілятор не розуміє, яким шляхом піти.
Оскільки цей сценарій виникає, коли ми отримуємо спадщину у формі ромба, ця проблема називається « Алмазна проблема '.
Проблема Diamond, реалізована на C ++, призводить до помилки двозначності при компіляції. Ми можемо вирішити цю проблему, зробивши базовий клас кореневим віртуальним. Ми дізнаємось більше про ключове слово “віртуальний” у нашому майбутньому посібнику з поліморфізму.
# 3) Багаторівневе успадкування
Багаторівневе успадкування представлено нижче.
У багаторівневому успадкуванні клас походить від іншого похідного класу. Це успадкування може мати стільки рівнів, поки наша реалізація не йде химерно. На наведеній вище схемі клас C походить від класу B. Клас B, у свою чергу, походить від класу A.
Побачимо приклад багаторівневого успадкування.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< Вихід:
Щеня має 4 ноги
Щеня має 1 хвіст
Щеня гавкає !!! Щеня плаче !!
Тут ми змінили приклад для одиночного успадкування таким чином, що є новий клас Щеня, який успадковує від класу Собака, який, у свою чергу, успадковує від класу Animal. Ми бачимо, що клас Щеня набуває та використовує властивості та методи обох класів над ним.
# 4) Гібридне успадкування
Гібридне успадкування зображено нижче.
Гібридне успадкування - це, як правило, поєднання декількох видів успадкування. У наведеному вище поданні ми маємо множинне успадкування (B, C та D) та багаторівневе успадкування (A, B та D), щоб отримати гібридне успадкування.
Давайте побачимо приклад гібридного успадкування.
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
Вихід:
Введіть ідентифікатор студента та ім'я студента 25 Вед
Введіть 3 позначки теми: 89 88 87
Введіть спортивні оцінки: 40
Загальна кількість балів = 264
Середні оцінки = 88
Середнє + спортивні оцінки = 128
Тут ми маємо чотири класи, тобто студент, оцінки, спорт та результат. Оцінки походять від студентського класу. Результат класу походить від оцінок та спорту, оскільки ми обчислюємо результат за оцінками предмета, а також за оцінками спорту.
Вихідні дані генеруються шляхом створення об’єкта класу Result, який набув властивостей усіх трьох класів.
Зверніть увагу, що в гібридному успадкуванні також реалізація може призвести до 'Діамантової проблеми', яку можна вирішити за допомогою ключового слова 'віртуальне', як уже згадувалося раніше.
No5) Ієрархічне успадкування
В ієрархічному успадкуванні більше одного класу успадковується від одного базового класу, як показано у поданні вище. Це надає йому структуру ієрархії.
Нижче наведено приклад, що демонструє ієрархічне успадкування.
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< Вихід:
Введіть довжину та ширину прямокутника: 10 5
Площа прямокутника = 50
Введіть основу та висоту трикутника: 4 8
Площа трикутника = 16
Введіть довжину однієї сторони квадрата: 5
Площа квадрата = 20
Наведений приклад є класичним прикладом класу Shape. У нас є базовий клас Shape і три класи, тобто прямокутник, трикутник і квадрат отримані з нього.
У нас є метод зчитування даних у класі Shape, тоді як кожен похідний клас має власний метод для обчислення площі. У головній функції ми зчитуємо дані для кожного об’єкта, а потім обчислюємо площу.
Висновок
Порівняно з іншими мовами програмування, мова С ++ підтримує всі типи успадкування. Насправді, можна сказати, що C ++ має дуже хорошу підтримку для успадкування. Ми можемо ефективніше моделювати проблеми в режимі реального часу, використовуючи С ++.
У цьому посібнику ми побачили всі типи успадкування, підтримувані C ++.
Також прочитайте = >> Типи успадкування в Java
У нашому майбутньому підручнику ми дізнаємось більше про особливість поліморфізму ООП.
=> Ознайомтесь із Повною серією навчальних програм для C ++ тут.
Рекомендована література
- Спадкування в C ++
- Типи даних C ++
- Види ризиків у програмних проектах
- Типи даних Python
- Найкращий БЕЗКОШТОВНИЙ підручник з C #: Остаточний посібник для C # для початківців
- Типи циклів оболонки Unix: виконуйте в той час, як цикл, для циклу, до циклу в Unix
- Різні типи збігів, надані Mockito
- 7 типів програмних помилок, які повинен знати кожен тестер