Dedičnosť v C++
Dedičnosť je základným pojmom v OOP (Objektovo orientované programovanie) . Je to mechanizmus, pomocou ktorého môže jedna trieda zdediť vlastnosti (polia a metódy) inej triedy. Dedičnosť znamená vytváranie nových tried na základe existujúcich tried. Trieda, ktorá dedí z inej triedy, môže znova použiť metódy a polia tejto triedy.
Príklad: V nasledujúcom príklade je Zviera základnou triedou a Pes Mačka a Krava sú odvodené triedy, ktoré rozširujú triedu Zviera.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
Výstup
Dog barks Cat meows Cow moos
Vysvetlenie:
- Animal je základná trieda s funkciou sound().
- Pes Mačka a krava sú odvodené triedy, z ktorých každá definuje svoju vlastnú metódu sound().
- V main() sa objekty Pes Mačka a Krava vytvárajú oddelene.
- Keď na každý objekt zavoláme sound(), spustí sa príslušná metóda triedy dieťaťa (Pes breše Mačka mňauká krava bučí).
Syntax
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Ako funguje dedičnosť v C++?
Dvojbodka (:) s an špecifikátor prístupu sa používa na dedenie v C++. Umožňuje odvodenej triede (podradená trieda) zdediť dátové členy (polia) a členské funkcie (metódy) základnej triedy (nadradená trieda).
Keď trieda zdedí inú triedu, získa všetkých prístupných členov nadradenej triedy a podradená trieda ich môže tiež predefinovať (prepísať) alebo k nim pridať nové funkcie.
Typy dedičnosti v C++
Nižšie sú uvedené rôzne typy dedičnosti, ktoré podporuje C++.
1. Jediné dedičstvo
Pri jednoduchej dedičnosti je podtrieda odvodená iba od jednej nadtriedy. Dedí vlastnosti a správanie jednorodičovskej triedy. Niekedy sa nazýva aj jednoduché dedičstvo.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Výstup
This is a Vehicle This Vehicle is Car
2. Viacnásobné dedičstvo
In Viacnásobné dedičstvo jedna trieda môže mať viac ako jednu nadtriedu a dediť vlastnosti od všetkých rodičovských tried.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
Výstup
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Viacúrovňová dedičnosť
Viacúrovňová dedičnosť v C++ znamená, že trieda je odvodená od inej odvodenej triedy tvoriacej reťazec dedičnosti.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Výstup
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hierarchická dedičnosť
Pri hierarchickom dedičstve sa viac ako jedna podtrieda zdedí z jednej základnej triedy. t.j. z jednej základnej triedy sa vytvorí viac ako jedna odvodená trieda. Napríklad autá aj autobusy sú vozidlá.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
Výstup
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hybridná dedičnosť
Keď sa kombinujú dva alebo viac typov dedičstva v jednom programe. Trieda môže napríklad používať viacnásobnú dedičnosť a môže byť tiež súčasťou viacúrovňového reťazca dedičnosti.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
Výstup
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hybridná dedičnosť môže viesť k diamantový problém v C++. Toto sa stane, keď trieda zdedí z dvoch tried, ktoré obe zdieľajú rovnakú základnú triedu. Výsledkom je, že odvodená trieda získa viacero kópií členov základnej triedy, čo vytvára nejednoznačnosť, ktorú z nich použiť.
Poznámka: Riešením je použitie virtuálnej dedičnosti, takže je zdieľaná iba jedna kópia základnej triedy.
Výhody dedičnosti v C++
- Opätovná použiteľnosť kódu : Odvodená trieda môže priamo opätovne použiť dátové členy a metódy svojej základnej triedy, čím sa vyhne duplicite kódu.
- Abstrakcia: Podporuje abstraktné triedy (triedy s čisto virtuálnymi funkciami), ktoré definujú spoločné rozhranie vynucujúce abstrakciu.
- Hierarchia tried: Môžete vytvárať hierarchie (základné → odvodené → ďalej odvodené) na modelovanie vzťahov v reálnom svete.
- Polymorfizmus: Plne podporuje runtime polymorfizmus prostredníctvom virtuálnych funkcií a tiež polymorfizmus v čase kompilácie prostredníctvom preťaženia funkcií a šablón.
Nevýhody dedičnosti v C++
- Tesné spojenie: Podradená trieda sa stáva závislou od rodičovskej triedy. Akákoľvek zmena v základnej triede môže spôsobiť zmeny v odvodených triedach.
- Znížená flexibilita: Niekedy sa dedičnosť zneužíva tam, kde by zloženie (má-vzťah) lepšie viedlo k menej flexibilnému kódu.
- Zvýšená zložitosť: Hlboké hierarchie dedičnosti (viacúrovňové alebo hybridné) môžu sťažiť pochopenie kódu pri údržbe a ladení.
- Diamantový problém: Pri hybridnom alebo viacnásobnom dedení môže nastať nejednoznačnosť, ak sa rovnaká základná trieda zdedí viackrát.
- Réžia virtuálnych funkcií: Ak sa používa polymorfizmus (virtuálne funkcie), dochádza k malej réžii behu kvôli vyhľadávaniu virtuálnych tabuliek.