Rodzaje dziedziczenia w C++ Co powinieneś wiedzieć?

Opublikowany: 2023-04-05

Czy zastanawiałeś się kiedyś, jak zbudowane są niektóre popularne systemy oprogramowania? Wszystko to dzięki potężnemu mechanizmowi zwanemu dziedziczeniem w programowaniu zorientowanym obiektowo (OOP). Dziedziczenie umożliwia programistom tworzenie nowych klas opartych na istniejących, umożliwiając ponowne wykorzystanie kodu i wydajne tworzenie oprogramowania. Wyobraź sobie, że budujesz system, który wymaga kilku klas, z których każda ma wspólne atrybuty i zachowania.

Zamiast wielokrotnie pisać ten sam kod, możesz użyć dziedziczenia, aby utworzyć klasę bazową i wyprowadzić z niej nowe klasy, oszczędzając czas i wysiłek.

Dziedziczenie jest nie tylko wydajne, ale także wszechstronne. W C++ istnieje kilka typów dziedziczenia, z których każdy ma unikalne zalety i przypadki użycia.

W tym artykule przyjrzymy się dokładnie różnym typom dziedziczenia w C++ , dostarczając odpowiednie kody, wyjaśnienia i przykłady z życia wzięte w całym artykule.

Spis treści

Różne typy dziedziczenia w C++

Język programowania C++ oferuje swoim programistom pięć różnych rodzajów opcji dziedziczenia. W zależności od kontekstu i wymagań deweloperzy i programiści mogą pracować z dowolnym z tych typów dziedziczenia.

Pojedyncze dziedziczenie

Pojedyncze dziedziczenie jest najczęstszym typem dziedziczenia w C++. W dziedziczeniu pojedynczym klasa pochodna dziedziczy z jednej klasy podstawowej. Oznacza to, że klasa dziedziczy wszystkie publiczne i chronione składowe danych oraz funkcje składowe klasy bazowej, mając jednocześnie możliwość dodawania własnych składowych danych i funkcji składowych.

Sprawdź poniższy fragment kodu, aby zapoznać się ze składnią i zrozumieniem pojedynczego dziedziczenia:

// Klasa podstawowa

klasa Zwierzęta {

publiczny:

anuluj jedzenie () {

std::cout << „Zwierzę je” << std::endl;

}

};

// Klasy pochodnej

klasa Pies : publiczny Zwierzę {

publiczny:

nieważne szczekanie() {

std::cout << "Pies szczeka" << std::endl;

}

};

W tym przykładzie mamy klasę bazową o nazwie Animal z pojedynczą funkcją członkowską eat().Następnie definiujemy klasę pochodnąDog , która publicznie dziedziczy z Animal.Pies ma również swoją własną funkcję składową bark().Używając pojedynczego dziedziczenia,Dog może uzyskać dostęp do funkcji eat()klasyAnimali dodać własne zachowanie za pomocąfunkcji bark().

Kiedy używać pojedynczego dziedziczenia w C++

Programiści mogą używać pojedynczego dziedziczenia, aby utworzyć klasę pochodną, ​​która dodaje funkcjonalność do klasy podstawowej.

Na przykład możesz użyć pojedynczego dziedziczenia podczas tworzenia gry z udziałem różnych postaci, takich jak wojownicy, magowie i łucznicy. Wszystkie te postacie mają wspólne cechy i zachowania, takie jak punkty zdrowia, siła ataku i szybkość poruszania się. Korzystając z pojedynczego dziedziczenia, można utworzyć klasę bazową o nazwie Character, która zawiera typowe atrybuty i zachowania, i wyprowadzić z niej każdą klasę postaci, aby dodać jej unikalną funkcjonalność.

W dziedziczeniu wielokrotnym jedna klasa pochodna może dziedziczyć po wielu klasach podstawowych. Oznacza to, że klasa może mieć więcej niż jedną bezpośrednią klasę nadrzędną. W rezultacie klasa pochodna dziedziczy wszystkie publiczne i chronione składowe danych oraz funkcje składowe każdej klasy bazowej.

Oto przykład dziedziczenia wielokrotnego:

// Klasa bazowa 1

klasa Kształt {

publiczny:

wirtualny podwójny obszar() = 0;

};

// klasa podstawowa 2

klasa Kolor {

publiczny:

wirtualne std::string getColor() = 0;

};

// Klasy pochodnej

klasa Prostokąt: publiczny Kształt, publiczny Kolor {

publiczny:

nadpisanie podwójnego obszaru() {

szerokość powrotu * wysokość;

}

std::string getColor() zastąp {

kolor powrotu;

}

prywatny:

podwójna szerokość = 5,0;

podwójna wysokość = 3,0;

std::string kolor = „niebieski”;

};

W tym przykładzie mamy dwie klasy podstawowe, Shape i Color , z których każda ma swoją funkcję wirtualną.Następnie definiujemy klasę pochodnąRectangle , która dziedziczy zarówno po Shape, jak i Color.Rectangle zastępuje funkcje wirtualne obu klas podstawowych, aby zapewnić własną implementację. Korzystając z dziedziczenia wielokrotnego,Rectangle może dziedziczyć właściwości obu klas podstawowych, ShapeiColor, aby utworzyć prostokąt o określonym kolorze i obszarze.

Kiedy używać wielokrotnego dziedziczenia w C++

Użyj dziedziczenia wielokrotnego, jeśli chcesz połączyć funkcje z wielu klas podstawowych. Rozważmy na przykład aplikację GUI, która wymaga różnych typów kontrolek, takich jak przyciski, pola wyboru i pola tekstowe. Każdy typ kontrolki ma swoją funkcjonalność i zachowanie, ale mają one również wspólne funkcje, takie jak obsługa zdarzeń użytkownika i wyświetlanie tekstu.

Korzystając z dziedziczenia wielokrotnego, można utworzyć klasę bazową o nazwieControl , która zawiera wspólne funkcje, i wyprowadzić z niej każdy typ kontrolki, a także inne klasy podstawowe, które zawierają określone funkcje.

W dziedziczeniu hierarchicznym pojedyncza klasa bazowa jest dziedziczona przez wiele klas pochodnych. Podobnie jak w przypadku dziedziczenia wielokrotnego, klasy pochodne w dziedziczeniu hierarchicznym uzyskują wszystkie publiczne i chronione składowe danych oraz funkcje składowe klasy bazowej.

Oto fragment kodu, który pomoże Ci zrozumieć implementację dziedziczenia hierarchicznego w C++:

// Klasa podstawowa

klasa Zwierzęta {

publiczny:

wirtualna pustka makeSound() = 0;

};

// Klasa pochodna 1

klasa Kot : publiczny Zwierzę {

publiczny:

unieważnienie makeSound() zastąp {

std::cout << „Miau” << std::endl;

}

};

// Klasa pochodna 2

klasa Pies : publiczny Zwierzę {

publiczny:

unieważnienie makeSound() zastąp {

std::cout << "Hau" << std::endl;

}

};

W tym przykładzie mamy klasę bazową o nazwie Animal z funkcją wirtualną makeSound().Następnie definiujemy dwie klasy pochodne,Cat i Dog, które dziedziczą poAnimal. Każda klasa pochodna zastępuje funkcjęmakeSound() w celu zapewnienia własnej implementacji.Korzystając z dziedziczenia hierarchicznego, możemy tworzyć różne typy zwierząt, które mają wspólne zachowania, takie jak wydawanie dźwięków.

Kiedy używać dziedziczenia hierarchicznego w C++

Użyj dziedziczenia hierarchicznego, jeśli chcesz utworzyć wiele klas pochodnych, które mają wspólną funkcjonalność. Rozważmy na przykład aplikację bankową, która wymaga różnych typów kont, takich jak konta oszczędnościowe, konta czekowe i konta kart kredytowych. Wszystkie te typy kont mają wspólne cechy i zachowania, takie jak numer konta, saldo i oprocentowanie.

Korzystając z dziedziczenia hierarchicznego, można utworzyć klasę bazową o nazwie Konto, która zawiera typowe atrybuty i zachowania oraz wyprowadzić z niej każdy typ konta, aby dodać jego unikalną funkcjonalność.

Dziedziczenie wielopoziomowe

Dziedziczenie wielopoziomowe w C++ to rodzaj dziedziczenia, w którym klasa pochodna jest dziedziczona przez inną klasę pochodną. W tym scenariuszu klasa pochodna dziedziczy wszystkie publiczne i chronione składowe danych oraz funkcje składowe swojej bezpośredniej klasy nadrzędnej, która z kolei dziedziczy po własnej klasie nadrzędnej i tak dalej.

Oto jak można programowo zaimplementować dziedziczenie wielopoziomowe w C++:

// Klasa podstawowa

klasa pojazdu {

publiczny:

unieważnienie start() {

std::cout << "Pojazd jest uruchamiany" << std::endl;

}

};

// klasa pośrednia

klasa Samochód : pojazd publiczny {

publiczny:

pusty dysk() {

std::cout << "Samochód jedzie" << std::endl;

}

};

// Klasy pochodnej

klasa SportsCar : samochód publiczny {

publiczny:

anuluj przyspieszenie() {

std::cout << „Samochód sportowy przyspiesza” << std::endl;

}

};

Kiedy używać dziedziczenia wielopoziomowego w C++

Użyj dziedziczenia wielopoziomowego, jeśli chcesz utworzyć klasę pochodną, ​​która dziedziczy z innej klasy pochodnej i dodaje jej funkcjonalność. Rozważmy na przykład system oprogramowania, który wymaga różnych typów pojazdów, takich jak samochody, ciężarówki i motocykle. Te typy pojazdów mają wspólne cechy i zachowania, takie jak prędkość, przyspieszenie i hamowanie.

Korzystając z dziedziczenia wielopoziomowego, można utworzyć klasę bazową o nazwie Vehicle , która zawiera wspólne atrybuty i zachowania, oraz wyprowadzić z niej klasy pośrednie, takie jak CariTruck, aby dodać ich specyficzne funkcje. Następnie możesz wyprowadzićklasę SportsCar z klasy Car, aby dodać jej unikalną funkcjonalność.

Dziedziczenie hybrydowe to połączenie dwóch lub więcej rodzajów dziedziczenia. Nazywana również dziedziczeniem wirtualnym, klasa pochodna w dziedziczeniu hybrydowym dziedziczy z wielu klas podstawowych, z których niektóre są dziedziczone przez wiele ścieżek. Może to prowadzić do tworzenia złożonych hierarchii dziedziczenia i może być trudne do zrozumienia i utrzymania.

Sprawdźkursy tworzenia oprogramowania upGrad, aby podnieść swoje umiejętności.

Oto przykład dziedziczenia hybrydowego w C++:

// Klasa bazowa 1

klasa Zwierzęta {

publiczny:

wirtualna pustka makeSound() = 0;

};

// klasa podstawowa 2

klasa CanFly {

publiczny:

wirtualna pusta mucha() = 0;

};

// klasa podstawowa 3

klasa CanSwim {

publiczny:

wirtualna pustka pływania() = 0;

};

// Klasy pochodnej

klasa Nietoperz : publiczne Zwierzę, publiczne CanFly {

publiczny:

unieważnienie makeSound() zastąp {

std::cout << „Krzyk!”<< std::endl;

}

anuluj fly() zastąp {

std::cout << „Nietoperz leci” << std::endl;

}

};

// Klasy pochodnej

klasa Pingwin : publiczne Zwierzę, publiczne CanSwim {

publiczny:

unieważnienie makeSound() zastąp {

std::cout << „Huuu!”<< std::endl;

}

anuluj pływanie () zastąp {

std::cout << „Pingwin pływa” << std::endl;

}

};

Zapoznaj się z naszymi popularnymi kursami inżynierii oprogramowania

Magister informatyki na LJMU i IIITB Program certyfikacji cyberbezpieczeństwa Caltech CTME
Bootcamp programistyczny Full Stack Program PG w Blockchain
Executive PG Program w Full Stack Development
Zobacz wszystkie nasze kursy poniżej
Kursy inżynierii oprogramowania

Kiedy używać dziedziczenia hybrydowego w C++

Oprócz czterech typów dziedziczenia omówionych wcześniej, dziedziczenie hybrydowe może być przydatne w pewnych scenariuszach, w których wymagane jest wiele typów dziedziczenia. Użyj dziedziczenia hybrydowego, aby połączyć zalety wielu typów dziedziczenia.

Rozważmy na przykład system oprogramowania, który wymaga różnych typów zwierząt, z których niektóre potrafią latać, a inne pływać. Możesz użyć dziedziczenia hybrydowego, aby utworzyć klasę bazową o nazwie Animal i wyprowadzić z niej dwie klasy pośrednie, CanFlyiCanSwim. Wreszcie, korzystając z dziedziczenia hybrydowego, można wyprowadzić klasyBat i Penguinz obu klas pośrednich. KlasaBat będzie dziedziczyć po AnimaliCanFly, podczas gdy klasaPenguinbędzie dziedziczyć poAnimaliCanSwim. W ten sposób możesz tworzyć różne typy zwierząt o unikalnych kombinacjach umiejętności.

Dziedziczenie hybrydowe w C++ może być przydatne w złożonych systemach oprogramowania, w których wymagane są różne typy dziedziczenia. Jednak może również tworzyć złożone hierarchie dziedziczenia, które mogą być trudne do zrozumienia i utrzymania. Podobnie jak w przypadku innych rodzajów dziedziczenia, wybór odpowiedniego typu do określonych wymagań projektu programistycznego i celów projektowych ma kluczowe znaczenie.

Przeczytaj nasze popularne artykuły związane z tworzeniem oprogramowania

Sprawdź naszebezpłatne kursy technologiczne, aby uzyskać przewagę nad konkurencją.

Ważne rzeczy, o których należy pamiętać podczas korzystania z dziedziczenia:

Chociaż dziedziczenie jest potężnym mechanizmem w C++, ma również kilka czynników, które należy wziąć pod uwagę podczas implementacji.

  1. Unikaj głębokich hierarchii dziedziczenia : Głębokie hierarchie dziedziczenia mogą prowadzić do kodu, który jest trudny do odczytania, zrozumienia i utrzymania.Utrzymuj hierarchie dziedziczenia tak płytkie, jak to możliwe, aby poprawić czytelność kodu i łatwość konserwacji.
  2. Mądrze używaj modyfikatorów dostępu: Modyfikatory dostępu (publiczne, chronione i prywatne) sterują widocznością elementów danych i funkcji składowych w klasie.Używaj ich mądrze, aby uniknąć ujawniania szczegółów implementacji, które nie powinny być widoczne poza klasą.
  3. Unikaj dziedziczenia diamentów: dziedziczenie diamentów występuje, gdy klasa dziedziczy po dwóch klasach, które dziedziczą po tej samej klasie bazowej.Może to prowadzić do niejasności i generalnie najlepiej jest tego unikać.
  4. Unikaj nadużywania dziedziczenia: Chociaż dziedziczenie może być przydatne, ważne jest, aby unikać jego nadużywania.W niektórych przypadkach lepszym wyborem może być kompozycja lub inne wzorce projektowe.

Zapoznaj się z naszymi bezpłatnymi kursami tworzenia oprogramowania

Podstawy przetwarzania w chmurze Podstawy JavaScript od podstaw Struktury danych i algorytmy
Technologia Blockchain Reaguj dla początkujących Podstawowe podstawy Javy
Jawa Node.js dla początkujących Zaawansowany JavaScript

Na wynos

Podsumowując, dziedziczenie jest kluczowym pojęciem w programowaniu w C++, które każdy student programowania powinien opanować. Dzięki zrozumieniu różnych typów dziedziczenia i przypadków ich użycia możesz tworzyć wydajny, zorganizowany i łatwy w utrzymaniu kod, stając się w ten sposób lepszym programistą.

Jeśli ten artykuł był dla Ciebie interesujący, możesz dodatkowo poszerzyć swoją wiedzę na temat tworzenia oprogramowania, rejestrując się w programie certyfikacji DevOps firmy upGrad, oferowanym we współpracy z IIIT Bangalore. Ten program obejmuje różne aspekty tworzenia oprogramowania, w tym kodowanie, testowanie i wdrażanie, i może pomóc Ci stać się wykwalifikowanym programistą w branży.

Dlaczego dziedziczenie jest ważne w programowaniu w C++?

Dzięki wykorzystaniu dziedziczenia programiści mogą zaoszczędzić czas i wysiłek w tworzeniu oprogramowania, aby w zorganizowany sposób budować złożone systemy oprogramowania. Ponieważ programiści pracują nad tworzeniem bardziej czytelnych kodów, proces kodowania upraszcza się do rozmaitości.

O czym należy pamiętać, korzystając z dziedziczenia w programowaniu w języku C++?

Korzystając z dziedziczenia w programowaniu w języku C++, należy pamiętać o kilku kluczowych kwestiach, takich jak unikanie głębokich hierarchii dziedziczenia, rozsądne stosowanie modyfikatorów dostępu, unikanie dziedziczenia rombowego i nienadużywanie dziedziczenia.

Jakiego rodzaju dziedziczenia powinienem używać w moim projekcie tworzenia oprogramowania?

Wybór właściwego typu dziedziczenia zależy od konkretnych wymagań projektu tworzenia oprogramowania i celów projektowych. Wybór spośród różnych rodzajów dziedziczenia całkowicie zależy od wymagań projektu. Dlatego zanim przystąpisz do działania, dokonaj szczegółowej analizy.