types inheritance c
Preskúmajte všetky typy dedenia v C ++ pomocou príkladov.
V našom predchádzajúcom tutoriáli sme sa dozvedeli o dedičnosti v C ++. V závislosti od spôsobu, akým je trieda odvodená alebo koľko základných tried trieda dedí, máme nasledujúce typy dedičstva:
- Jednotné dedičstvo
- Viacnásobné dedičstvo
- Viacúrovňové dedičstvo
- Hierarchické dedičstvo
- Hybridné dedičstvo
=> Ak chcete preskúmať celý zoznam výukových programov C ++, prečítajte si tu.
Čo sa dozviete:
Druhy dedenia
Ďalej je uvedené obrazové znázornenie rôznych druhov dedičstva.
Každý typ dedičstva uvidíme s príkladmi v nasledujúcich častiach.
# 1) Dedičné dedičstvo
V jednoduchom dedičstve je trieda odvodená iba od jednej základnej triedy. To znamená, že existuje iba jedna podtrieda, ktorá je odvodená z jednej nadtriedy.
Samostatné dedičstvo sa zvyčajne vyhlasuje takto:
class subclassname : accessspecifier superclassname { //class specific code; };
Ďalej je uvedený úplný príklad jednoduchého dedičstva.
#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 '< Výkon:
Pes má 4 nohy
Pes má 1 chvost
Psie štekanie !!!
Ako základnú triedu máme triedu Animal, z ktorej sme odvodili podtriedu psa. Trieda pes zdedí všetkých členov triedy zvierat a je možné ju rozšíriť tak, aby zahŕňala aj svoje vlastné vlastnosti, ako je zrejmé z výstupu.
Samostatné dedičstvo je najjednoduchšia forma dedičstva.
# 2) Viacnásobné dedičstvo
Viacnásobné dedičstvo je znázornené nižšie.
Viacnásobné dedičstvo je typ dedičstva, v ktorom je trieda odvodená z viac ako jednej triedy. Ako je zrejmé z vyššie uvedeného diagramu, trieda C je podtrieda, ktorá má ako nadradenú triedu A a triedu B.
V scenári skutočného života dieťa dedí po svojom otcovi a matke. To možno považovať za príklad viacnásobného dedičstva.
Nasledujúci program uvádzame na demonštráciu viacnásobného dedičstva.
#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 }
Výkon:
Zadajte číslo role: 25
Zadajte dve najvyššie značky: 40 50
Zadajte známku pre spoločenské aktivity: 30
Rolka č. 25
Celkový počet bodov: 120
Priemerné známky: 40
Vo vyššie uvedenom príklade máme tri triedy, tj. Student_marks, cocurricular_marks a Result. Trieda student_marks pre študenta prečíta známku z predmetu. Trieda cocurricular_marks číta známky študenta v rámci spoludiackych aktivít.
Trieda Výsledok počíta pre študenta celkové_hodnoty spolu s priemernými známkami.
V tomto modeli je trieda Výsledok odvodená od student_marks a cocurricular_marks, keď vypočítavame Výsledok z predmetu, ako aj od značiek spoluúčasti.
Toto vykazuje viac dedičstiev.
Diamond problém
Diamantový problém je znázornený nižšie:
testovanie jednotiek vs funkčné testovanie vs testovanie integrácie
Máme triedu detí, ktorá zdedila dve triedy - otca a matku. Tieto dve triedy zase dedia triedu Osoba.
Ako je znázornené na obrázku, trieda Dieťa dedí vlastnosti triedy Osoba dvakrát, t. J. Raz od otca a druhýkrát od matky. To vedie k nejednoznačnosti, pretože kompilátor nechápe, ktorým smerom sa má vydať.
Pretože tento scenár vzniká, keď máme dedičstvo v tvare diamantu, tento problém sa skvele nazýva „ Diamantový problém “.
Diamond problém implementovaný v C ++ má za následok chybu nejednoznačnosti pri kompilácii. Tento problém môžeme vyriešiť tak, že sa základná trieda root stane virtuálnou. Viac sa o „virtuálnom“ kľúčovom slove dozvieme v našom pripravovanom výučbe polymorfizmu.
# 3) Viacúrovňové dedičstvo
Viacúrovňové dedičstvo je uvedené nižšie.
Vo viacúrovňovom dedení je trieda odvodená od inej odvodenej triedy. Toto dedičstvo môže mať toľko úrovní, pokiaľ naša implementácia nebude nepriaznivá. Vo vyššie uvedenom diagrame je trieda C odvodená od triedy B. Trieda B je zase odvodená od triedy A.
Pozrime sa na príklad viacúrovňovej dedičnosti.
#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 '< Výkon:
Šteňa má 4 nožičky
Šteňa má 1 chvost
Šteňa šteká !!! Šteňa plače !!
Tu sme upravili príklad pre Single inheritance tak, že existuje nová trieda Puppy, ktorá dedí z triedy Dog, ktorá zasa dedí z triedy Animal. Vidíme, že trieda Puppy získava a používa vlastnosti a metódy oboch tried nad ňou.
# 4) Hybridné dedičstvo
Hybridné dedičstvo je zobrazené nižšie.
Hybridné dedičstvo je zvyčajne kombináciou viacerých typov dedičstva. Vo vyššie uvedenej reprezentácii máme viacnásobné dedičstvo (B, C a D) a viacúrovňové dedičstvo (A, B a D), aby sme získali hybridné dedičstvo.
Pozrime sa na príklad hybridnej dedičnosti.
#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; }
Výkon:
Zadajte ID študenta a meno študenta 25 Ved
Zadajte 3 predmety: 89 88 87
Zadajte športové známky: 40
Celkom známok = 264
Priemerné známky = 88
Priemer + Športové známky = 128
Máme štyri triedy, tj Študent, Známky, Šport a Výsledok. Známky sú odvodené od triedy študentov. Výsledok triedy je odvodený zo známok a športu, keď vypočítavame výsledok zo známok predmetu aj zo športových známok.
Výstup sa generuje vytvorením objektu triedy Result, ktorý získal vlastnosti všetkých troch tried.
Upozorňujeme, že aj pri hybridnom dedičstve môže implementácia vyústiť do problému „Diamond Problem“, ktorý je možné vyriešiť pomocou kľúčového slova „virtual“, ako už bolo spomenuté vyššie.
# 5) Hierarchické dedičstvo
V hierarchickom dedení dedí viac ako jedna trieda z jednej základnej triedy, ako je to znázornené na obrázku vyššie. To mu dáva štruktúru hierarchie.
Ďalej je uvedený príklad demonštrujúci hierarchickú dedičnosť.
#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< Výkon:
Zadajte dĺžku a šírku obdĺžnika: 10 5
Plocha obdĺžnika = 50
Zadajte základňu a výšku trojuholníka: 4 8
Plocha trojuholníka = 16
Zadajte dĺžku jednej strany štvorca: 5
Plocha štvorca = 20
Vyššie uvedený príklad je klasickým príkladom triedy Shape. Máme základnú triedu Tvar a od nej sú odvodené tri triedy, tj. Obdĺžnik, trojuholník a štvorec.
Máme metódu na čítanie údajov v triede Shape, zatiaľ čo každá odvodená trieda má svoju vlastnú metódu na výpočet oblasti. V hlavnej funkcii načítame údaje pre každý objekt a potom vypočítame plochu.
Záver
V porovnaní s ostatnými programovacími jazykmi podporuje jazyk C ++ všetky typy dedenia. V skutočnosti môžeme povedať, že C ++ má veľmi dobrú podporu dedenia. Problémy v reálnom čase môžeme modelovať efektívnejšie pomocou C ++.
V tomto tutoriáli sme videli všetky typy dedenia podporované v C ++.
Prečítajte si tiež = >> Typy dedenia v Jave
V našom pripravovanom výučbe sa dozvieme viac o funkcii polymorfizmu OOP.
=> Kompletnú sériu školení C ++ ZDARMA nájdete tu.
Odporúčané čítanie
- Dedenie v C ++
- Dátové typy C ++
- Typy rizík v softvérových projektoch
- Dátové typy v Pythone
- Najlepšia výučbová séria C # ZDARMA: Sprievodca C # pre začiatočníkov
- Typy Unix Shell Loop: Robte Loop, For Loop, Until Loop v Unixe
- Rôzne typy zápaliek, ktoré poskytuje Mockito
- 7 typov softvérových chýb, ktoré by mal poznať každý tester