types inheritance c
Istražite sve vrste nasljeđivanja na C ++ s primjerima.
U našem prethodnom tutorialu saznali smo o nasljeđivanju u C ++. Ovisno o načinu na koji je klasa izvedena ili koliko osnovnih klasa nasljeđuje klasa, imamo sljedeće vrste nasljeđivanja:
- Nasljeđivanje pojedinačno
- Višestruko nasljeđivanje
- Nasljeđivanje na više razina
- Hijerarhijsko nasljeđivanje
- Hibridno nasljeđivanje
=> Pogledajte ovdje kako biste istražili cjeloviti popis vodiča za C ++.
Što ćete naučiti:
Vrste nasljeđivanja
Slijedi slikoviti prikaz različitih vrsta nasljedstva.
U slijedećim odjeljcima vidjet ćemo svaku vrstu nasljeđivanja s primjerima.
# 1) Jedno nasljeđivanje
U pojedinačnom nasljeđivanju, klasa proizlazi samo iz jedne osnovne klase. To znači da postoji samo jedan podrazred koji je izveden iz jednog superrazreda.
Nasljedstvo se obično prijavljuje na sljedeći način:
class subclassname : accessspecifier superclassname { //class specific code; };
Dolje je dat cjelovit Primjer nasljedstva.
#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 '< Izlaz:
Pas ima 4 noge
Pas ima 1 rep
Pas laje !!!
Imamo klasu Životinja kao osnovnu klasu iz koje smo izveli podrazred psa. Klasa pas nasljeđuje sve članove klase Animal i može se proširiti tako da uključuje svoja svojstva, kao što se vidi iz rezultata.
Nasljeđivanje pojedinačno je najjednostavniji oblik nasljeđivanja.
# 2) Višestruko nasljeđivanje
Višestruko nasljeđivanje slikovito je predstavljeno u nastavku.

Višestruko nasljeđivanje vrsta je nasljeđivanja u kojoj klasa potječe iz više klasa. Kao što je prikazano na gornjem dijagramu, klasa C je podrazred kojoj su klasa A i klasa B kao roditelj.
U stvarnom scenariju dijete nasljeđuje oca i majku. To se može smatrati primjerom višestrukog nasljeđivanja.
Predstavljamo program u nastavku da bismo demonstrirali višestruko nasljeđivanje.
#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 }
Izlaz:
Unesite broj role: 25
Unesite dvije najviše ocjene: 40 50
Unesite oznaku za predškolske aktivnosti: 30
Broj role: 25
Ukupne ocjene: 120
Prosječne ocjene: 40
U gornjem primjeru imamo tri razreda, tj. Studentske_oznake, kurikularne_oznake i Rezultat. Oznaka student__razreda čita oznaku predmeta za učenika. Razred cocurricular_marks čita ocjene učenika u sukurikularnim aktivnostima.
Razred Rezultat izračunava ukupne_oznake za učenika zajedno s prosječnim ocjenama.
U ovom modelu, razred Rezultat izveden je iz oznaka_učenika i zajedničkih kurikuluma dok izračunavamo rezultat iz predmeta kao i ocjene sukurikularnih aktivnosti.
Ovo pokazuje više nasljedstava.
Dijamantni problem
Dijamantni problem slikovito je predstavljen u nastavku:

kako ukloniti elemente iz niza Java
Ovdje imamo razred djece koji nasljeđuje dva razreda Otac i Majka. Te dvije klase, pak, nasljeđuju klasu Osoba.
Kao što je prikazano na slici, razred Dijete osobine razreda Osoba nasljeđuje dva puta, tj. Jednom od oca, a drugi put od majke. To dovodi do dvosmislenosti jer kompajler ne uspijeva razumjeti kojim putem krenuti.
Budući da se ovaj scenarij pojavljuje kada imamo nasljeđe u obliku dijamanta, ovaj se problem glasovito naziva „ Dijamantni problem '.
Dijamantni problem implementiran u C ++ rezultira pogreškom dvosmislenosti pri kompilaciji. Taj problem možemo riješiti tako da osnovnu klasu pretvorimo u virtualnu. O ključnoj riječi 'virtualni' naučit ćemo u našem nadolazećem vodiču o polimorfizmu.
# 3) Višerazinsko nasljeđivanje
Višerazinsko nasljeđivanje predstavljeno je u nastavku.

U višerazinskom nasljeđivanju, klasa je izvedena iz druge izvedene klase. Ovo nasljeđe može imati onoliko razina ako naša implementacija ne zalazi. U gornjem dijagramu, klasa C izvedena je iz klase B. Klasa B je pak izvedena iz klase A.
Pogledajmo primjer višerazinskog nasljeđivanja.
#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 '< Izlaz:
Štene ima 4 noge
Štene ima 1 rep
Štene laje !!! Štene plače !!
Ovdje smo izmijenili primjer za nasljeđivanje Single tako da postoji nova klasa Puppy koja nasljeđuje iz klase Dog koja zauzvrat nasljeđuje iz klase Animal. Vidimo da klasa Štene stječe i koristi svojstva i metode obje klase iznad sebe.
# 4) Hibridno nasljeđivanje
Hibridno nasljeđivanje prikazano je u nastavku.

Hibridno nasljeđivanje obično je kombinacija više vrsta nasljeđivanja. U gornjem prikazu imamo višestruko nasljeđivanje (B, C i D) i višerazinsko nasljeđivanje (A, B i D) kako bismo dobili hibridno nasljeđe.
Pogledajmo primjer hibridnog nasljeđivanja.
#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; }
Izlaz:
Unesite ID studenta i ime studenta 25 Ved
Unesite 3 ocjene predmeta: 89 88 87
Upišite sportske ocjene: 40
Ukupne ocjene = 264
Prosječne ocjene = 88
Prosjek + sportske ocjene = 128
Ovdje imamo četiri razreda, tj. Student, ocjene, sport i rezultat. Oznake su izvedene iz studentskog razreda. Rezultat klase proizlazi iz Oznaka i sporta jer izračunavamo rezultat iz ocjene predmeta kao i ocjene sporta.
Izlaz se generira stvaranjem objekta klase Rezultat koji je stekao svojstva sve tri klase.
Imajte na umu da i u hibridnom nasljeđivanju implementacija može rezultirati 'Dijamantnim problemom' koji se može riješiti pomoću ključne riječi 'virtual' kao što je prethodno spomenuto.
# 5) Hijerarhijsko nasljeđivanje

U hijerarhijskom nasljeđivanju, više od jedne klase nasljeđuje iz jedne osnovne klase kao što je prikazano u gornjoj predstavi. To mu daje strukturu hijerarhije.
Slijedi primjer koji pokazuje hijerarhijsko nasljeđivanje.
#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< Izlaz:
Unesite duljinu i širinu pravokutnika: 10 5
Površina pravokutnika = 50
Unesite bazu i visinu trokuta: 4 8
Površina trokuta = 16
Unesite duljinu jedne stranice kvadrata: 5
Površina kvadrata = 20
Gornji je primjer klasični primjer klase Oblik. Imamo osnovnu klasu Shape i iz nje se izvode tri klase, tj. Pravokutnik, trokut i kvadrat.
Imamo metodu za čitanje podataka u klasi Shape, dok svaka izvedena klasa ima svoju metodu za izračunavanje površine. U glavnoj funkciji čitamo podatke za svaki objekt, a zatim izračunavamo površinu.
Zaključak
U usporedbi s ostalim programskim jezicima, jezik C ++ podržava sve vrste nasljeđivanja. Zapravo možemo reći da C ++ ima vrlo dobru podršku za nasljeđivanje. Pomoću C ++ možemo učinkovitije modelirati probleme u stvarnom vremenu.
U ovom uputstvu vidjeli smo sve vrste nasljeđivanja podržane od C ++.
Također pročitajte = >> Vrste nasljeđivanja u Javi
U našem nadolazećem tutorialu naučit ćemo više o značajci polimorfizma OOP-a.
=> Ovdje pogledajte kompletnu C ++ BESPLATNU seriju treninga.
Preporučena literatura
- Nasljeđivanje u C ++
- Vrste podataka C ++
- Vrste rizika u softverskim projektima
- Python tipovi podataka
- Najbolji BESPLATNI vodiči za C #: Vrhunski vodič za C # za početnike
- Tipovi petlje Unix školjke: Radite dok se petljate, za petlju, dok se petlja ne dogodi u Unixu
- Različite vrste podudaranja koje pruža Mockito
- 7 vrsta softverskih pogrešaka koje bi svaki tester trebao znati