types inheritance c
Raziščite vse vrste dedovanja v jeziku C ++ s primeri.
V prejšnji vadnici smo izvedeli o dedovanju v jeziku C ++. Glede na način izpeljave razreda ali število osnovnih razredov, ki jih razred podeduje, imamo naslednje vrste dedovanja:
- Enkratno dedovanje
- Večkratno dedovanje
- Dedovanje na več ravneh
- Hierarhično dedovanje
- Hibridno dedovanje
=> Glejte tukaj, če želite raziskati celoten seznam vadnic za C ++.
Kaj se boste naučili:
Vrste dedovanja
Spodaj je slikovna predstavitev različnih vrst dedovanja.
Vsako vrsto dedovanja bomo videli s primeri v spodnjih odsekih.
# 1) Posamezno dedovanje
Pri enojnem dedovanju razred izhaja samo iz enega osnovnega razreda. To pomeni, da obstaja samo en podrazred, ki izhaja iz enega superrazreda.
Enotna dediščina se običajno prijavi na naslednji način:
class subclassname : accessspecifier superclassname { //class specific code; };
Spodaj je celoten primer posamičnega dedovanja.
#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 '< Izhod:
Pes ima 4 noge
Pes ima 1 rep
Pes laje !!!
Za osnovni razred imamo razred Žival, iz katerega smo izpeljali podrazred psa. Razredni pes podeduje vse člane razreda Animal in ga je mogoče razširiti tako, da vključuje lastne lastnosti, kot je razvidno iz rezultata.
Enotna dediščina je najpreprostejša oblika dedovanja.
# 2) Večkratno dedovanje
Večkratno dedovanje je slikovno predstavljeno spodaj.

Večkratno dedovanje je vrsta dedovanja, pri katerem razred izhaja iz več kot enega razreda. Kot je prikazano v zgornjem diagramu, je razred C podrazred, ki ima za nadrejene razred A in B.
V resničnem scenariju otrok deduje po očetu in materi. To lahko štejemo za primer večkratnega dedovanja.
Predstavljamo spodnji program za dokazovanje večkratne dediščine.
#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 }
Izhod:
Vnesite številko zvitka: 25
Vpišite dve najvišji oceni: 40 50
Vnesite oznako za medšolske dejavnosti: 30
Številka zvitka: 25
Skupno ocen: 120
Povprečne ocene: 40
V zgornjem primeru imamo tri razrede, to so študentske oznake, kurikularne_znake in rezultat. Razred student_marks bere oznako predmeta za učenca. Razred cocurricular_marks bere študentove ocene pri sopredmetnih dejavnostih.
Razred Rezultat izračuna skupne_oznake za študenta skupaj s povprečnimi ocenami.
V tem modelu je razred Rezultat izpeljan iz študentskih oznak in kokurikularnih_znakov, saj izračunamo rezultat tako iz predmeta kot tudi iz ocen kurikularnih dejavnosti.
Ta prikazuje več dediščin.
Problem diamantov
Diamond Problem je slikovito predstavljen spodaj:

binarni program drevesnega iskanja v javi
Tukaj imamo otroški razred, ki podeduje dva razreda Oče in Mati. Ta dva razreda pa podedujeta razred Oseba.
Kot je prikazano na sliki, razred Otrok podeduje lastnosti razreda Oseba dvakrat, torej enkrat od Očeta in drugič od Matere. To povzroča dvoumnost, saj prevajalnik ne razume, v katero smer naj gre.
Ker se ta scenarij pojavi, ko imamo dediščino v obliki diamanta, se ta problem znano imenuje ' Problem diamantov '.
Diamantni problem, izveden v jeziku C ++, povzroča dvoumne napake pri prevajanju. To težavo lahko rešimo tako, da osnovni razred root naredimo virtualnega. Več o 'virtualni' ključni besedi bomo izvedeli v naši prihajajoči vadnici o polimorfizmu.
# 3) Dedovanje na več ravneh
Dediščina na več ravneh je predstavljena spodaj.

Pri dedovanju na več ravneh razred izhaja iz drugega izvedenega razreda. Ta dediščina ima lahko toliko ravni, če naša izvedba ne gre navzdol. V zgornjem diagramu razred C izhaja iz razreda B. Razred B pa izhaja iz razreda A.
Oglejmo si primer večstopenjske dediščine.
#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 '< Izhod:
Psiček ima 4 noge
Psiček ima 1 rep
Psiček laja !!! Psiček joka !!
Tu smo spremenili primer za dedovanje Single, tako da obstaja nov razred Puppy, ki podeduje iz razreda Dog, ta pa iz razreda Animal. Vidimo, da razred Puppy pridobi in uporablja lastnosti in metode obeh razredov nad njim.
# 4) Hibridno dedovanje
Hibridno dedovanje je prikazano spodaj.

Hibridno dedovanje je običajno kombinacija več kot ene vrste dedovanja. V zgornji predstavitvi imamo večkratno dedovanje (B, C in D) in večstopenjsko dedovanje (A, B in D), da dobimo hibridno dedovanje.
Oglejmo si primer hibridne dediščine.
#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; }
Izhod:
Vnesite ID študenta in ime študenta 25 Ved
Vnesite 3 ocene predmeta: 89 88 87
Vnesite športne ocene: 40
Skupne ocene = 264
Povprečne ocene = 88
Povprečje + športne ocene = 128
Tu imamo štiri razrede, tj. Študent, ocene, šport in rezultat. Oznake izhajajo iz študentskega razreda. Razred Rezultat izhaja iz ocen in športa, saj rezultat izračunamo tako iz ocen predmeta kot iz športnih ocen.
Izhod se ustvari z ustvarjanjem predmeta razreda Rezultat, ki je pridobil lastnosti vseh treh razredov.
Upoštevajte, da lahko tudi pri hibridnem dedovanju izvedba povzroči 'diamantni problem', ki ga je mogoče rešiti s ključno besedo 'virtual', kot smo že omenili.
# 5) Hierarhično dedovanje

Pri hierarhičnem dedovanju iz enega osnovnega razreda podeduje več razredov, kot je prikazano v zgornji predstavitvi. To mu daje strukturo hierarhije.
Spodaj je naveden primer, ki dokazuje hierarhično dedovanje.
#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< Izhod:
Vnesite dolžino in širino pravokotnika: 10 5
Površina pravokotnika = 50
Vnesite osnovo in višino trikotnika: 4 8
Površina trikotnika = 16
Vnesite dolžino ene strani kvadrata: 5
Površina kvadrata = 20
Zgornji primer je klasičen primer razreda Shape. Imamo osnovni razred Shape in iz njega izhajajo trije razredi, tj. Pravokotnik, trikotnik in kvadrat.
Imamo metodo za branje podatkov v razredu Shape, medtem ko ima vsak izpeljani razred svojo metodo za izračun površine. V glavni funkciji preberemo podatke za vsak predmet in nato izračunamo površino.
Zaključek
V primerjavi z drugimi programskimi jeziki jezik C ++ podpira vse vrste dedovanja. Pravzaprav lahko rečemo, da ima C ++ zelo dobro podporo za dedovanje. S C ++ lahko učinkoviteje modeliramo probleme v realnem času.
V tej vadnici smo videli vse vrste dedovanja, ki jih podpira C ++.
Preberite tudi = >> Vrste dedovanja v Javi
V naši prihajajoči vadnici bomo izvedeli več o značilnosti polimorfizma OOP.
=> Tukaj si oglejte celotno serijo BREZPLAČNIH vadb za C ++.
Priporočeno branje
- Dedovanje v jeziku C ++
- Vrste podatkov C ++
- Vrste tveganj pri programskih projektih
- Vrste podatkov Python
- Najboljša BREZPLAČNA vadnica za C #: Ultimate C # Guide za začetnike
- Vrste lupine Unix Shell: Ali v zanki, For Loop, dokler Loop v Unixu
- Različne vrste ujemanj, ki jih ponuja Mockito
- 7 vrst napak programske opreme, ki bi jih moral poznati vsak preizkuševalec