Rodzaje dziedziczenia w C++ Co powinieneś wiedzieć?
Opublikowany: 2023-04-05Czy 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.
- 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.
- 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ą.
- 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ć.
- 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.