types inheritance c
Udforsk alle arvetyper i C ++ med eksempler.
I vores tidligere tutorial lærte vi om arv i C ++. Afhængig af den måde, klassen afledes på, eller hvor mange baseklasser en klasse arver, har vi følgende arvetyper:
- Enkelt arv
- Flere arv
- Multilevel arv
- Hierarkisk arv
- Hybrid arv
=> Se her for at udforske den komplette C ++ tutorials-liste.
Hvad du vil lære:
Typer af arv
Nedenfor er en billedlig gengivelse af de forskellige typer arv.
Vi vil se hver type arv med eksempler i nedenstående sektioner.
# 1) Enkelt arv
I en enkelt arv stammer en klasse kun fra en basisklasse. Dette betyder, at der kun er én underklasse, der stammer fra en superklasse.
Enkel arv erklæres normalt som følger:
class subclassname : accessspecifier superclassname { //class specific code; };
Nedenfor er et komplet eksempel på enkelt 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:
Hund har 4 ben
Hund har 1 hale
Hund bjeffer !!!
Vi har et klasse Dyr som en basisklasse, hvorfra vi har afledt en underklassehund. Klassehund arver alle medlemmer af dyreklassen og kan udvides til at omfatte sine egne egenskaber, set fra output.
Enkel arv er den enkleste form for arv.
# 2) Flere arv
Flere arv er billedmæssigt repræsenteret nedenfor.

Flere arv er en type arv, hvor en klasse stammer fra mere end en klasse. Som vist i ovenstående diagram er klasse C en underklasse, der har klasse A og klasse B som overordnet.
I et virkeligt scenarie arver et barn fra sin far og mor. Dette kan betragtes som et eksempel på flere arv.
Vi præsenterer nedenstående program for at 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 }
Produktion:
Indtast rulle nr .: 25
Indtast de to højeste karakterer: 40 50
Indtast mærket for CoCurricular Activities: 30
Rulle nr. 25
Samlet karakter: 120
Gennemsnitlige karakterer: 40
I ovenstående eksempel har vi tre klasser, dvs. student_marks, kursusmærker og resultat. Klassen student_mærker læser emnets karakter for den studerende. Klassen cocurricular_marks læser de studerendes karakterer i aktiviteterne i læseplanerne.
Resultatklassen beregner total_marks for eleven sammen med gennemsnittet.
I denne model er resultatklassen afledt af student_marks og curricricular_marks, når vi beregner resultat fra emnet såvel som co-curricular activity marks.
Dette udviser flere arv.
Diamantproblem
Diamond Problem er billedmæssigt repræsenteret nedenfor:

gratis beskyttelse af malware i realtid 2017
Her har vi en barneklasse, der arver to klasser far og mor. Disse to klasser arver igen klassen Person.
Som vist i figuren arver klasse Barn egenskaberne i klasse Person to gange, dvs. en gang fra far og anden gang fra mor. Dette giver anledning til tvetydighed, da kompilatoren ikke forstår, hvilken vej der skal gå.
Da dette scenarie opstår, når vi har en diamantformet arv, kaldes dette problem berømt ' Diamantproblemet ”.
Diamantproblemet implementeret i C ++ resulterer i tvetydighedsfejl ved kompilering. Vi kan løse dette problem ved at gøre rodbaseklassen som virtuel. Vi lærer mere om det 'virtuelle' nøgleord i vores kommende tutorial om polymorfisme.
# 3) Arvelighed på flere niveauer
Multilevel arv er repræsenteret nedenfor.

I arv på flere niveauer stammer en klasse fra en anden afledt klasse. Denne arv kan have så mange niveauer, så længe vores implementering ikke går galt. I ovenstående diagram er klasse C afledt af klasse B. Klasse B er igen afledt af klasse A.
Lad os se et eksempel på multilevel 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 '< Produktion:
Hvalp har 4 ben
Hvalp har 1 hale
Hvalp bjeffer !!! Hvalp græder !!
Her ændrede vi eksemplet til enkelt arv, så der er en ny klasse hvalp, der arver fra klassen Hund, som igen arver fra klasse Dyr. Vi ser, at klassen Puppy erhverver og bruger egenskaberne og metoderne for begge klasser over den.
# 4) Hybrid arv
Hybrid arv er afbildet nedenfor.

Hybrid arv er normalt en kombination af mere end en type arv. I ovenstående repræsentation har vi flere arv (B, C og D) og flere niveauer (A, B og D) for at få en hybrid arv.
Lad os 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; }
Produktion:
Indtast studerendes id og studerendes navn 25 Ved
Indtast 3 emnemarkeringer: 89 88 87
Indtast sportsmærker: 40
Samlede karakterer = 264
Gennemsnitlige karakterer = 88
Gennemsnit + Sportsmærker = 128
Her har vi fire klasser, dvs. studerende, mærker, sport og resultat. Karakterer kommer fra studenterklassen. Klassen Resultat stammer fra Marks and Sports, når vi beregner resultatet fra både emnets karakterer og sportsmærker.
Outputtet genereres ved at oprette et objekt i klasse Resultat, der har erhvervet egenskaberne for alle de tre klasser.
Bemærk, at også i hybrid arv kan implementeringen resultere i 'Diamond Problem', som kan løses ved hjælp af 'virtuelt' nøgleord som tidligere nævnt.
# 5) Hierarkisk arv

I hierarkisk arv arver mere end en klasse fra en enkelt baseklasse som vist i repræsentationen ovenfor. Dette giver det en struktur i et hierarki.
Nedenfor er eksemplet, der 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< Produktion:
Indtast længden og bredden af et rektangel: 10 5
Areal af rektanglet = 50
Indtast bunden og højden af trekanten: 4 8
Areal af trekanten = 16
Indtast længden på den ene side af firkanten: 5
Firkantet areal = 20
Ovenstående eksempel er et klassisk eksempel på klasse Shape. Vi har en basisklasseform og tre klasser, dvs. rektangel, trekant og firkant er afledt af den.
Vi har en metode til at læse data i Shape-klassen, mens hver afledte klasse har sin egen metode til at beregne areal. I hovedfunktionen læser vi data for hvert objekt og beregner derefter arealet.
Konklusion
Sammenlignet med de andre programmeringssprog understøtter C ++ sprog alle typer arv. Faktisk kan vi sige, at C ++ har meget god støtte til arv. Vi kan modellere realtidsproblemer mere effektivt ved hjælp af C ++.
I denne vejledning har vi set alle typer arv understøttet af C ++.
Læs også = >> Typer af arv i Java
I vores kommende vejledning lærer vi mere om polymorfismefunktionen i OOP.
=> Tjek den komplette C ++ GRATIS træningsserie her.
Anbefalet læsning
- Arv i C ++
- C ++ datatyper
- Typer af risici i softwareprojekter
- Python-datatyper
- Bedste GRATIS C # tutorialsserie: Den ultimative C # guide til begyndere
- Unix Shell Loop-typer: Gør mens Loop, For Loop, indtil Loop i Unix
- Forskellige typer matchere leveret af Mockito
- 7 typer softwarefejl, som hver tester burde vide