types inheritance c
Utforsk alle arvetyper i C ++ med eksempler.
I vår forrige opplæring lærte vi om arv i C ++. Avhengig av måten klassen er avledet på eller hvor mange baseklasser en klasse arver, har vi følgende typer arv:
- Enkeltarv
- Flere arv
- Multilevel Arv
- Hierarkisk arv
- Hybrid arv
=> Se her for å utforske hele C ++ opplæringslisten.
Hva du vil lære:
Typer arv
Nedenfor er en billedlig fremstilling av de forskjellige typer arv.
Vi vil se hver type arv med eksempler i avsnittene nedenfor.
# 1) Enkelt arv
I enkelt arv stammer en klasse bare fra en basisklasse. Dette betyr at det bare er en underklasse som er avledet fra en superklasse.
Enkel arv blir vanligvis erklært som følger:
class subclassname : accessspecifier superclassname { //class specific code; };
Nedenfor er et komplett eksempel på enkeltarv.
#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 '< Produksjon:
Hunden har 4 ben
Hunden har 1 hale
Hund bjeffer !!!
Vi har en klasse Animal som en basisklasse som vi har avledet en underklassehund fra. Klassehund arver alle medlemmene i dyreklassen og kan utvides til å omfatte sine egne egenskaper, sett fra produksjonen.
Enkel arv er den enkleste formen for arv.
# 2) Flere arv
Flere arv er illustrert nedenfor.
Flere arv er en type arv der en klasse kommer fra mer enn en klasse. Som vist i diagrammet ovenfor, er klasse C en underklasse som har klasse A og klasse B som overordnet.
I et virkelig scenario arver et barn fra sin far og mor. Dette kan betraktes som et eksempel på flere arv.
Vi presenterer programmet nedenfor for å demonstrere flere 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 }
Produksjon:
Skriv inn rull nr .: 25
Angi de to høyeste karakterene: 40 50
Skriv inn merket for CoCurricular Activities: 30
Rull nr: 25
Totalkarakter: 120
Gjennomsnittlige karakterer: 40
I eksemplet ovenfor har vi tre klasser, det vil si student_marks, curricricular_marks og Result. Klassen student_marks leser emnet for studenten. Klassen kursplanmerker leser studentens karakterer i fellesskapsaktiviteter.
Resultatklassen beregner total_marks for studenten sammen med gjennomsnittskarakterene.
I denne modellen er resultatklassen avledet fra student_marks og kursplan_merker når vi beregner resultat fra emnet, så vel som samfunnsaktivitetsmerker.
Dette viser flere arv.
Diamantproblem
Diamond Problem er illustrert nedenfor:
beste pc-renser og optimaliseringsfri
Her har vi en barneklasse som arver to klasser Far og mor. Disse to klassene arver i sin tur klassen Person.
Som vist i figuren, arver klasse Barn egenskapene til klasse Person to ganger, dvs. en gang fra far og andre gang fra mor. Dette gir tvetydighet da kompilatoren ikke forstår hvilken vei å gå.
Siden dette scenariet oppstår når vi har en diamantformet arv, blir dette problemet kjent som ' Diamantproblemet ”.
Diamond-problemet implementert i C ++ resulterer i tvetydighetsfeil ved kompilering. Vi kan løse dette problemet ved å gjøre rotbaseklassen som virtuell. Vi vil lære mer om det 'virtuelle' nøkkelordet i vår kommende opplæring om polymorfisme.
# 3) Arv på flere nivåer
Multilevel arv er representert nedenfor.
I arv på flere nivåer kommer en klasse fra en annen avledet klasse. Denne arven kan ha så mange nivåer så lenge implementeringen vår ikke går annerledes. I diagrammet ovenfor er klasse C avledet fra klasse B. Klasse B er igjen avledet fra klasse A.
La oss se et eksempel på flernivå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!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< Produksjon:
Valp har 4 ben
Valpen har 1 hale
Valp bjeffer !!! Valp gråter !!
Her modifiserte vi eksemplet for enkeltarv slik at det er en ny klasse valp som arver fra klassen Hund som igjen arver fra klassen Animal. Vi ser at klassen Puppy tilegner seg og bruker egenskapene og metodene til begge klassene over den.
# 4) Hybrid arv
Hybrid arv er avbildet nedenfor.
Hybrid arv er vanligvis en kombinasjon av mer enn en type arv. I representasjonen ovenfor har vi flere arv (B, C og D) og arv på flere nivåer (A, B og D) for å få en hybrid arv.
La oss se et eksempel 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; }
Produksjon:
Skriv inn student-ID og studentnavn 25 Ved
Skriv inn 3 fagmerker: 89 88 87
Angi sportsmerker: 40
Totalkarakter = 264
Gjennomsnittlige karakterer = 88
Gjennomsnitt + Sportskarakterer = 128
Her har vi fire klasser, dvs. student, merker, sport og resultat. Karakterer kommer fra studentklassen. Klassen Resultat stammer fra Marks and Sports når vi beregner resultatet fra både fagkarakterer og sportskarakterer.
Resultatet genereres ved å opprette et objekt i klasse Resultat som har tilegnet seg egenskapene til alle de tre klassene.
Vær oppmerksom på at også i hybridarv kan implementeringen resultere i 'Diamond Problem' som kan løses ved hjelp av 'virtuelt' nøkkelord som nevnt tidligere.
# 5) Hierarkisk arv
I hierarkisk arv arver mer enn en klasse fra en enkelt baseklasse som vist i representasjonen ovenfor. Dette gir den en struktur av et hierarki.
Nedenfor er eksemplet som demonstrerer 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< Produksjon:
Angi lengden og bredden på et rektangel: 10 5
Areal av rektangelet = 50
Angi bunnen og høyden på trekanten: 4 8
Areal av trekanten = 16
Angi lengden på den ene siden av firkanten: 5
Arealet av torget = 20
Ovennevnte eksempel er et klassisk eksempel på klasse Shape. Vi har en basisklasse figur og tre klasser, dvs. rektangel, trekant og firkant er avledet fra den.
Vi har en metode for å lese data i Shape-klassen, mens hver avledede klasse har sin egen metode for å beregne areal. I hovedfunksjonen leser vi data for hvert objekt og beregner deretter arealet.
Konklusjon
Sammenlignet med de andre programmeringsspråkene støtter C ++ språk alle typer arv. Faktisk kan vi si at C ++ har veldig god støtte for arv. Vi kan modellere sanntidsproblemer mer effektivt ved hjelp av C ++.
I denne opplæringen har vi sett alle typer arv støttet av C ++.
Les også = >> Typer arv i Java
I vår kommende opplæring vil vi lære mer om polymorfisme-funksjonen til OOP.
=> Sjekk den komplette C ++ GRATIS treningsserien her.
Anbefalt lesing
- Arv i C ++
- C ++ datatyper
- Typer av risikoer i programvareprosjekter
- Python datatyper
- Beste GRATIS C # opplæringsserie: The Ultimate C # Guide For Beginners
- Unix Shell Loop Typer: Gjør Mens Loop, For Loop, Inntil Loop i Unix
- Ulike typer matchere levert av Mockito
- 7 typer programvarefeil som alle testere burde vite