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
№ на ролката: 25
Общо оценки: 120
Средни оценки: 40
В горния пример имаме три класа, т.е. студентски марки, съвместни учебни знаци и резултат. Класът student_marks чете темата за ученика. Класът cocurricular_marks чете оценките на ученика в съвместни учебни дейности.
Класът Резултат изчислява total_mark за студента заедно със средните оценки.
В този модел класът Result се извлича от student_marks и cocurricular_marks, тъй като ние изчисляваме Result от предмета, както и от съвместни учебни дейности.
Това показва множество наследства.
Диамантен проблем
Диамантеният проблем е изобразен по-долу:

процес на управление на дефекти при тестване на софтуер
Тук имаме детски клас, наследяващ два класа баща и майка. Тези два класа от своя страна наследяват класа Person.
Както е показано на фигурата, клас Child наследява два пъти характеристиките на клас Person, т.е. веднъж от баща и втори път от майка. Това поражда двусмислие, тъй като компилаторът не успява да разбере по кой път да върви.
Тъй като този сценарий възниква, когато имаме наследство във формата на диамант, този проблем се нарича „ Проблемът с диамантите ”.
Проблемът с диаманта, реализиран в C ++, води до грешка при двусмислието при компилацията. Можем да разрешим този проблем, като направим основния основен клас виртуален. Ще научим повече за ключовата дума „virtual“ в нашия предстоящ урок за полиморфизма.
# 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 опашка
Кученце Лае !!! Кученце плаче !!
Тук модифицирахме примера за единично наследяване, така че има нов клас Puppy, който наследява от класа Dog, който от своя страна наследява от клас Animal. Виждаме, че класът Puppy придобива и използва свойствата и методите на двата класа над него.
# 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 Ved
Въведете 3 марки за тема: 89 88 87
Въведете спортни оценки: 40
Общо оценки = 264
Средни оценки = 88
Средно + спортни оценки = 128
Тук имаме четири класа, т.е. студент, оценки, спорт и резултат. Оценките са получени от студентския клас. Резултатът от класа произтича от Marks and Sports, тъй като ние изчисляваме резултата от оценките на предмета, както и от спортните оценки.
Резултатът се генерира чрез създаване на обект от клас Резултат, който е придобил свойствата на трите класа.
Имайте предвид, че и при хибридното наследяване внедряването може да доведе до „Диамантен проблем“, който може да бъде разрешен с помощта на ключова дума „виртуален“, както беше споменато по-горе.
# 5) Йерархично наследяване

При йерархично наследяване повече от един клас наследява от един основен клас, както е показано в представлението по-горе. Това му придава структура на йерархия.
По-долу е даден Примерът, демонстриращ йерархично наследяване.
#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 ++ има много добра поддръжка за наследяване. Можем да моделираме проблеми в реално време по-ефективно, използвайки C ++.
В този урок видяхме всички видове наследяване, поддържани от C ++.
Прочетете също = >> Видове наследяване в Java
В нашия предстоящ урок ще научим повече за характеристиката на полиморфизма на ООП.
=> Проверете пълната серия C ++ БЕЗПЛАТНИ обучения тук.
Препоръчително четене
- Наследяване в C ++
- Типове данни на C ++
- Видове рискове при софтуерни проекти
- Типове данни на Python
- Най-добрият БЕЗПЛАТЕН урок за C #: Най-доброто ръководство за C # за начинаещи
- Типове на цикъла на Unix Shell: Правете докато цикъл, За цикъл, До цикъл в Unix
- Различни видове съвпадения, предоставени от Mockito
- 7 вида софтуерни грешки, които всеки тестер трябва да знае