types inheritance c
Prozkoumejte všechny typy dědičnosti v C ++ pomocí příkladů.
V našem předchozím kurzu jsme se dozvěděli o dědičnosti v C ++. V závislosti na tom, jak je třída odvozena nebo kolik základních tříd třída dědí, máme následující typy dědičnosti:
- Single dědičnost
- Vícenásobné dědictví
- Víceúrovňová dědičnost
- Hierarchická dědičnost
- Hybridní dědičnost
=> Prohlédněte si zde Úplný seznam výukových programů C ++.
Co se naučíte:
Druhy dědičnosti
Níže je uvedeno obrazové znázornění různých typů dědičnosti.
V následujících částech uvidíme každý typ dědičnosti s příklady.
# 1) Jednoduché dědictví
V jednoduché dědičnosti je třída odvozena pouze z jedné základní třídy. To znamená, že existuje pouze jedna podtřída, která je odvozena z jedné nadtřídy.
Jednotlivé dědictví se obvykle deklarují takto:
class subclassname : accessspecifier superclassname { //class specific code; };
Níže je uveden úplný příklad jednoduché dědič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!!!'; } }; int main() { Dog dog; cout<<'Dog has '< Výstup:
Pes má 4 nohy
Pes má 1 ocas
Štěká pes !!!
Jako základní třídu máme třídu Zvíře, ze které jsme odvodili podtřídu psa. Třída pes dědí všechny členy třídy zvířat a lze ji rozšířit tak, aby zahrnovala své vlastní vlastnosti, jak je patrné z výstupu.
Jednoduché dědictví je nejjednodušší formou dědictví.
# 2) Vícenásobné dědictví
Vícenásobná dědičnost je zobrazena níže.
Vícenásobná dědičnost je typ dědičnosti, ve které třída pochází z více než jedné třídy. Jak je znázorněno ve výše uvedeném diagramu, třída C je podtřída, která má jako nadřazenou třídu A a třídu.
V reálném scénáři dědí dítě po svém otci a matce. To lze považovat za příklad vícenásobného dědictví.
Níže uvádíme program, který demonstruje vícenásobnou dědičnost.
#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ýstup:
Zadejte číslo role: 25
Zadejte dvě nejvyšší značky: 40 50
Zadejte značku pro CoCurricular Activities: 30
Role č. 25
Celkem známek: 120
Průměrné známky: 40
Ve výše uvedeném příkladu máme tři třídy, tj. Student_marks, cocurricular_marks a Result. Třída student_marks čte značku předmětu pro studenta. Třída cocurricular_marks čte známky studenta při společných kurikulárních aktivitách.
Třída Result vypočítá pro studenta celkem_značky spolu s průměrnými známkami.
V tomto modelu je třída Result odvozena od student_marks a cocurricular_marks, jak počítáme Result z předmětu, stejně jako značky společných kurikulárních aktivit.
To vykazuje několik dědičností.
Diamond problém
Diamond Problem je zobrazen níže:
Android rozhovor otázky a odpovědi na 3 roky zkušeností
Tady máme třídu dětí, která zdědila dvě třídy - otce a matku. Tyto dvě třídy zase dědí osobu třídy.
Jak je znázorněno na obrázku, třída Dítě zdědí vlastnosti třídy Osoba dvakrát, tj. Jednou od otce a podruhé od matky. To vede k nejednoznačnosti, protože kompilátor nerozumí, kterou cestou má jít.
Protože tento scénář nastává, když máme dědictví ve tvaru diamantu, tento problém se skvěle nazývá „ Diamantový problém “.
Diamond problém implementovaný v C ++ má za následek chybu nejednoznačnosti při kompilaci. Tento problém můžeme vyřešit tak, že se základní třída root stane virtuální. Více se o „virtuálním“ klíčovém slově dozvíme v našem připravovaném výukovém programu o polymorfismu.
# 3) Víceúrovňová dědičnost
Víceúrovňová dědičnost je uvedena níže.
Ve víceúrovňové dědičnosti je třída odvozena z jiné odvozené třídy. Tato dědičnost může mít tolik úrovní, dokud naše implementace nepůjde neúspěšně. Ve výše uvedeném diagramu je třída C odvozena od třídy B. Třída B je zase odvozena od třídy A.
Podívejme se na příklad víceúrovňové dědič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ýstup:
Štěně má 4 nohy
Štěně má 1 ocas
Štěně štěká !!! Štěně pláče !!
Zde jsme upravili příklad pro Single dědičnost tak, že existuje nová třída Puppy, která dědí ze třídy Dog, která zase dědí ze třídy Animal. Vidíme, že třída Puppy získává a používá vlastnosti a metody obou tříd nad ní.
# 4) Hybridní dědičnost
Hybridní dědičnost je znázorněna níže.
Hybridní dědičnost je obvykle kombinací více než jednoho typu dědičnosti. Ve výše uvedené reprezentaci máme vícenásobnou dědičnost (B, C a D) a víceúrovňovou dědičnost (A, B a D), abychom získali hybridní dědičnost.
Podívejme se na příklad hybridní dědič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ýstup:
Zadejte ID studenta a jméno studenta 25 Ved
Zadejte 3 předměty: 89 88 87
Zadejte sportovní známky: 40
Celkem známek = 264
Průměrné známky = 88
Průměr + sportovní známky = 128
Zde máme čtyři třídy, tj. Student, Marks, Sports a Result. Známky jsou odvozeny od třídy studentů. Výsledek třídy je odvozen ze známek a sportu, když vypočítáváme výsledek ze známek předmětu i sportovních známek.
Výstup je generován vytvořením objektu třídy Result, který získal vlastnosti všech tří tříd.
Všimněte si, že i v hybridní dědičnosti může implementace vyústit v „Diamantový problém“, který lze vyřešit pomocí „virtuálního“ klíčového slova, jak bylo uvedeno výše.
# 5) Hierarchická dědičnost
V hierarchické dědičnosti dědí více než jedna třída z jedné základní třídy, jak je znázorněno výše. To mu dává strukturu hierarchie.
Níže je uveden příklad demonstrující hierarchickou dědičnost.
#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ýstup:
Zadejte délku a šířku obdélníku: 10 5
Plocha obdélníku = 50
Zadejte základnu a výšku trojúhelníku: 4 8
Plocha trojúhelníku = 16
Zadejte délku jedné strany čtverce: 5
Plocha čtverce = 20
Výše uvedený příklad je klasickým příkladem třídy Shape. Máme základní třídu Shape a od ní jsou odvozeny tři třídy, tj. Obdélník, trojúhelník a čtverec.
Máme metodu pro čtení dat ve třídě Shape, zatímco každá odvozená třída má vlastní metodu pro výpočet oblasti. V hlavní funkci načteme data pro každý objekt a poté vypočítáme plochu.
Závěr
Ve srovnání s ostatními programovacími jazyky podporuje jazyk C ++ všechny typy dědičnosti. Ve skutečnosti můžeme říci, že C ++ má velmi dobrou podporu dědičnosti. Problémy v reálném čase můžeme efektivněji modelovat pomocí C ++.
V tomto kurzu jsme viděli všechny typy dědičnosti podporované C ++.
Přečtěte si také = >> Druhy dědičnosti v Javě
V našem nadcházejícím tutoriálu se dozvíme více o polymorfismu funkce OOP.
=> Zde si můžete prohlédnout kompletní sérii školení C ++ ZDARMA.
Doporučené čtení
- Dědičnost v C ++
- Datové typy C ++
- Druhy rizik v softwarových projektech
- Datové typy Pythonu
- Nejlepší ZDARMA C # Tutorial Series: The Ultimate C # Guide For Beginners
- Typy smyček Unix Shell: Provádějte smyčku, smyčku, dokud smyčku v Unixu
- Různé typy Matchers poskytované Mockito
- 7 typů softwarových chyb, které by měl každý tester vědět