types inheritance c
Poznaj wszystkie typy dziedziczenia w C ++ z przykładami.
W naszym poprzednim samouczku dowiedzieliśmy się o dziedziczeniu w C ++. W zależności od sposobu, w jaki klasa jest wyprowadzana lub ile klas bazowych dziedziczy, mamy następujące typy dziedziczenia:
- Dziedziczenie pojedyncze
- Dziedziczenie wielokrotne
- Dziedziczenie wielopoziomowe
- Dziedziczenie hierarchiczne
- Dziedziczenie hybrydowe
=> Zobacz tutaj, aby poznać pełną listę samouczków języka C ++.
Czego się nauczysz:
Rodzaje dziedziczenia
Poniżej przedstawiono obrazowe przedstawienie różnych typów dziedziczenia.
W poniższych sekcjach zobaczymy każdy rodzaj dziedziczenia z przykładami.
1) Pojedyncze dziedziczenie
W przypadku dziedziczenia pojedynczego klasa wywodzi się tylko z jednej klasy bazowej. Oznacza to, że istnieje tylko jedna podklasa, która pochodzi z jednej nadklasy.
Dziedziczenie pojedyncze jest zwykle deklarowane w następujący sposób:
class subclassname : accessspecifier superclassname { //class specific code; };
Poniżej przedstawiono pełny przykład pojedynczego dziedziczenia.
#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 '< Wynik:
Pies ma 4 nogi
Pies ma 1 ogon
Pies szczeka!!!
Jako klasę bazową mamy klasę Animal, z której wyprowadziliśmy podklasę dog. Pies klasowy dziedziczy wszystkie elementy klasy Animal i może zostać rozszerzony o własne właściwości, jak widać na wyjściu.
Dziedziczenie pojedyncze to najprostsza forma dziedziczenia.
# 2) Dziedziczenie wielokrotne
Dziedziczenie wielokrotne przedstawiono graficznie poniżej.

Dziedziczenie wielokrotne to rodzaj dziedziczenia, w którym klasa wywodzi się z więcej niż jednej klasy. Jak pokazano na powyższym diagramie, klasa C jest podklasą, która ma klasę A i klasę B jako rodzica.
W prawdziwym scenariuszu dziecko dziedziczy po ojcu i matce. Można to uznać za przykład wielokrotnego dziedziczenia.
Przedstawiamy poniższy program, aby zademonstrować wielokrotne dziedziczenie.
#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 }
Wynik:
Wprowadź numer rolki: 25
Wpisz dwie najwyższe oceny: 40 50
Wpisz ocenę dla zajęć CoCurricular: 30
Rzut nr: 25
Ogólna ocena: 120
Średnia ocen: 40
W powyższym przykładzie mamy trzy klasy, tj. Student_marks, cocurricular_marks i Result. Klasa student_marks odczytuje ocenę przedmiotu dla ucznia. Klasa cocurricular_marks odczytuje oceny uczniów z zajęć dodatkowych.
Klasa Result oblicza total_marks dla ucznia wraz ze średnimi ocenami.
W tym modelu klasa Result jest wyprowadzana ze student_marks i cocurricular_marks, gdy obliczamy wynik z przedmiotu, a także znaczniki zajęć towarzyszących.
To wykazuje wiele dziedziczenia.
Problem z diamentami
Diamentowy problem przedstawiono obrazowo poniżej:

podział równoważności i analiza wartości brzegowych
Tutaj mamy klasę dziecięcą dziedziczącą dwie klasy: Ojciec i Matka. Te dwie klasy z kolei dziedziczą klasę Person.
Jak widać na rysunku, klasa Dziecko dwukrotnie dziedziczy cechy klasy Osoba, czyli raz od Ojca, a drugi raz od Matki. Powoduje to niejednoznaczność, ponieważ kompilator nie rozumie, którą drogą iść.
Ponieważ taki scenariusz pojawia się, gdy mamy dziedziczenie w kształcie rombu, problem ten jest znany jako „ Problem diamentów ”.
Problem Diamond zaimplementowany w C ++ powoduje błąd niejednoznaczności podczas kompilacji. Możemy rozwiązać ten problem, ustawiając główną klasę bazową jako wirtualną. Dowiemy się więcej o słowie kluczowym „wirtualne” w naszym nadchodzącym samouczku dotyczącym polimorfizmu.
# 3) Dziedziczenie wielopoziomowe
Dziedziczenie wielopoziomowe przedstawiono poniżej.

W przypadku dziedziczenia wielopoziomowego klasa jest pochodną innej klasy pochodnej. To dziedziczenie może mieć tyle poziomów, o ile nasza implementacja nie pójdzie na marne. Na powyższym diagramie klasa C wywodzi się z klasy B. Klasa B z kolei wywodzi się z klasy A.
Zobaczmy przykład wielopoziomowego dziedziczenia.
#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 '< Wynik:
Szczeniak ma 4 nogi
Szczeniak ma 1 ogon
Puppy Barks !!! Puppy Weeps !!
Tutaj zmodyfikowaliśmy przykład dla dziedziczenia Single w taki sposób, że istnieje nowa klasa Puppy, która dziedziczy po klasie Dog, która z kolei dziedziczy po klasie Animal. Widzimy, że klasa Puppy nabywa i wykorzystuje właściwości i metody obu klas powyżej.
# 4) Dziedziczenie hybrydowe
Dziedziczenie hybrydowe przedstawiono poniżej.

Dziedziczenie hybrydowe jest zwykle połączeniem więcej niż jednego typu dziedziczenia. W powyższej reprezentacji mamy dziedziczenie wielokrotne (B, C i D) oraz dziedziczenie wielopoziomowe (A, B i D), aby uzyskać dziedziczenie hybrydowe.
Zobaczmy przykład dziedziczenia hybrydowego.
#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; }
Wynik:
Wprowadź identyfikator i nazwisko ucznia 25 Ved
Wpisz 3 znaki tematyczne: 89 88 87
Wpisz znaki sportowe: 40
Suma ocen = 264
Średnia ocen = 88
Średnia + oceny sportowe = 128
Tutaj mamy cztery klasy, tj. Student, Oceny, Sport i Wynik. Oceny pochodzą z klasy studenta. Klasa Result pochodzi od Marks and Sports, ponieważ obliczamy wynik na podstawie ocen przedmiotowych i sportowych.
Wynik jest generowany przez utworzenie obiektu klasy Result, który uzyskał właściwości wszystkich trzech klas.
Należy zauważyć, że również w dziedziczeniu hybrydowym implementacja może skutkować „Problemem diamentu”, który można rozwiązać za pomocą słowa kluczowego „wirtualnego”, jak wspomniano wcześniej.
# 5) Dziedziczenie hierarchiczne

W dziedziczeniu hierarchicznym więcej niż jedna klasa dziedziczy z jednej klasy bazowej, jak pokazano na powyższej reprezentacji. Daje to strukturę hierarchii.
Poniżej podano przykład demonstrujący dziedziczenie hierarchiczne.
#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< Wynik:
Wpisz długość i szerokość prostokąta: 10 5
Powierzchnia prostokąta = 50
Podaj podstawę i wysokość trójkąta: 4 8
Pole trójkąta = 16
Podaj długość jednego boku kwadratu: 5
Powierzchnia kwadratu = 20
Powyższy przykład jest klasycznym przykładem klasy Shape. Mamy klasę bazową Shape i są z niej wyprowadzane trzy klasy tj. Prostokąt, trójkąt i kwadrat.
Mamy metodę odczytywania danych w klasie Shape, podczas gdy każda klasa pochodna ma własną metodę obliczania powierzchni. W funkcji głównej odczytujemy dane dla każdego obiektu, a następnie obliczamy powierzchnię.
Wniosek
W porównaniu z innymi językami programowania, język C ++ obsługuje wszystkie typy dziedziczenia. W rzeczywistości możemy powiedzieć, że C ++ ma bardzo dobre wsparcie dla dziedziczenia. Możemy efektywniej modelować problemy w czasie rzeczywistym za pomocą C ++.
W tym samouczku widzieliśmy wszystkie typy dziedziczenia obsługiwane przez C ++.
Przeczytaj także = >> Rodzaje dziedziczenia w Javie
W naszym nadchodzącym samouczku dowiemy się więcej o funkcji polimorfizmu w OOP.
=> Sprawdź całą serię bezpłatnych szkoleń C ++ tutaj.
rekomendowane lektury
- Dziedziczenie w C ++
- Typy danych C ++
- Rodzaje zagrożeń w projektach oprogramowania
- Typy danych w Pythonie
- Najlepsza DARMOWA seria samouczków języka C #: najlepszy przewodnik po języku C # dla początkujących
- Typy pętli powłoki Unix: Do While Loop, For Loop, Until Loop w Unixie
- Różne typy dopasowań zapewniane przez Mockito
- 7 rodzajów błędów oprogramowania, które powinien znać każdy tester