types inheritance c
Utforska alla typer av arv i C ++ med exempel.
I vår tidigare handledning lärde vi oss om arv i C ++. Beroende på hur klassen härleds eller hur många basklasser en klass ärver har vi följande typer av arv:
- Enstaka arv
- Flera arv
- Arv på flera nivåer
- Hierarkisk arv
- Hybrid arv
=> Se här för att utforska listan över C ++ -studier.
Vad du kommer att lära dig:
Typer av arv
Nedan följer en bildföreställning av olika typer av arv.
Vi kommer att se varje typ av arv med exempel i nedanstående avsnitt.
# 1) Enkel arv
I enstaka arv härrör en klass endast från en basklass. Det betyder att det bara finns en underklass som härrör från en superklass.
Enstaka arv förklaras vanligtvis enligt följande:
class subclassname : accessspecifier superclassname { //class specific code; };
Nedan följer ett komplett exempel på enstaka arv.
#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 '< Produktion:
Hunden har 4 ben
Hunden har 1 svans
Hund skäller !!!
Vi har en klass Animal som basklass från vilken vi har härledt en underklasshund. Klasshund ärver alla medlemmar i djurklassen och kan utökas till att inkludera sina egna egenskaper, sett från produktionen.
Enstaka arv är den enklaste formen av arv.
# 2) Flera arv
Multipel arv visas i bilden nedan.

Multipel arv är en typ av arv där en klass härrör från mer än en klass. Som visas i ovanstående diagram är klass C en underklass som har klass A och klass B som överordnad.
I ett verkligt scenario ärver ett barn från sin far och mor. Detta kan betraktas som ett exempel på flera arv.
Vi presenterar nedanstående program för att demonstrera multipel arv.
#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 }
Produktion:
Ange rullnummer: 25
Ange de två högsta poängen: 40 50
Ange märket för CoCurricular Activities: 30
Rulle nr: 25
Totalt antal poäng: 120
Medelpoäng: 40
I exemplet ovan har vi tre klasser, det vill säga student_marks, curricricular_marks och Result. Klassens student_märken läser studentens ämnesmärke. Klassens kursområden läser elevens betyg i samordning.
Resultatklassen beräknar studentens totalvärden tillsammans med medelvärdena.
I den här modellen härrör resultatklassen från student_marks och curricular_marks när vi beräknar resultat från ämnet samt samordnade aktiviteter.
Detta uppvisar flera arv.
Diamantproblem
Diamantproblemet visas i bilden nedan:

hur man installerar en .jar-fil
Här har vi en barnklass som ärver två klasser far och mor. Dessa två klasser ärver i sin tur klassen Person.
Som framgår av figuren ärver klass Barn egenskaperna i klass Person två gånger, dvs en gång från far och andra gången från mor. Detta ger upphov till tvetydighet eftersom kompilatorn inte förstår vilken väg man ska gå.
Eftersom detta scenario uppstår när vi har ett diamantformat arv kallas detta problem berömt ” Diamantproblemet ”.
Diamond-problemet implementerat i C ++ resulterar i tvetydighetsfel vid kompileringen. Vi kan lösa detta problem genom att göra rotbasklassen som virtuell. Vi lär oss mer om det 'virtuella' nyckelordet i vår kommande handledning om polymorfism.
# 3) Arv på flera nivåer
Nedanstående arv från flera nivåer visas.

I arv med flera nivåer härrör en klass från en annan härledd klass. Det här arvet kan ha så många nivåer så länge som vår implementering inte går på väg. I ovanstående diagram härrör klass C från klass B. Klass B är i sin tur härledd från klass A.
Låt oss se ett exempel på arv i flera nivåer.
#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 '< Produktion:
Valpen har fyra ben
Valpen har 1 svans
Valp skäller !!! Valp gråter !!
Här modifierade vi exemplet för enstaka arv så att det finns en ny klass Valp som ärver från klassen Hund som i sin tur ärver från klassen Djur. Vi ser att klassen Puppy förvärvar och använder egenskaperna och metoderna för båda klasserna ovanför den.
# 4) Hybrid arv
Hybrid arv visas nedan.

Hybrid arv är vanligtvis en kombination av mer än en typ av arv. I ovanstående representation har vi flera arv (B, C och D) och arv med flera nivåer (A, B och D) för att få en hybrid arv.
Låt oss se ett exempel på hybrid arv.
#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; }
Produktion:
Ange student-ID och studentnamn 25 Ved
Ange 3 ämnesbetyg: 89 88 87
Ange sportmärken: 40
Totalt antal poäng = 264
Genomsnittliga poäng = 88
Genomsnitt + Sportmärken = 128
Här har vi fyra klasser, dvs student, märken, sport och resultat. Märken härrör från studentklassen. Klassresultatet kommer från Marks and Sports när vi beräknar resultatet från både ämnesmärkena och sportmärkena.
Utgången genereras genom att skapa ett objekt av klassresultat som har förvärvat egenskaperna för alla de tre klasserna.
Observera att även i hybridärv kan implementeringen resultera i 'Diamond Problem' som kan lösas med 'virtuellt' nyckelord som nämnts tidigare.
# 5) Hierarkisk arv

I hierarkisk arv ärver mer än en klass från en enda basklass som visas i representationen ovan. Detta ger den en struktur i en hierarki.
Nedan ges exemplet som visar hierarkisk arv.
#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< Produktion:
Ange längden och bredden på en rektangel: 10 5
Rektangelns yta = 50
Ange triangelns bas och höjd: 4 8
Area av triangeln = 16
Ange längden på ena sidan av rutan: 5
Kvadratens yta = 20
Ovanstående exempel är ett klassiskt exempel på klassform. Vi har en basklass Form och tre klasser dvs rektangel, triangel och kvadrat härrör från den.
Vi har en metod för att läsa data i Shape-klassen medan varje härledd klass har sin egen metod för att beräkna area. I huvudfunktionen läser vi data för varje objekt och beräknar sedan ytan.
Slutsats
Jämfört med andra programmeringsspråk stöder C ++ språk alla typer av arv. I själva verket kan vi säga att C ++ har mycket bra stöd för arv. Vi kan modellera realtidsproblem mer effektivt med C ++.
I den här handledningen har vi sett alla typer av arv som stöds av C ++.
Läs också = >> Typer av arv i Java
I vår kommande handledning lär vi oss mer om polymorfismfunktionen i OOP.
=> Kolla hela C ++ GRATIS träningsserien här.
Rekommenderad läsning
- Arv i C ++
- C ++ datatyper
- Typer av risker i programvaruprojekt
- Python-datatyper
- Bästa GRATIS C # -handledningsserie: Den ultimata C # -guiden för nybörjare
- Unix Shell Loop-typer: Gör While Loop, For Loop, tills Loop i Unix
- Olika typer av matchare från Mockito
- 7 typer av programvarufel som varje testare borde veta