Dědičnost v C++
Dědičnost je základním pojmem OOP (Objektově orientované programování) . Je to mechanismus, kterým je jedné třídě dovoleno zdědit vlastnosti (pole a metody) jiné třídy. Dědičnost znamená vytváření nových tříd na základě existujících tříd. Třída, která dědí z jiné třídy, může znovu použít metody a pole této třídy.
Příklad: V následujícím příkladu Animal je základní třída a Pes Kočka a Kráva jsou odvozené třídy, které rozšiřují třídu Animal.
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
Vysvětlení:
- Animal je základní třída s funkcí sound().
- Dog Cat a Cow jsou odvozené třídy, z nichž každá definuje svou vlastní metodu sound().
- V main() se objekty Pes Kočka a Kráva vytvářejí samostatně.
- Když na každý objekt zavoláme sound(), spustí se příslušná metoda podřízené třídy (pes štěká, kočka mňouká, kráva bučí).
Syntax
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Jak funguje dědičnost v C++?
Dvojtečka (:) s an specifikátor přístupu se používá pro dědění v C++. Umožňuje odvozené třídě (podřízené třídě) zdědit datové členy (pole) a členské funkce (metody) základní třídy (nadřazené třídy).
Když třída zdědí jinou třídu, získá všechny přístupné členy nadřazené třídy a podřízená třída je také může předefinovat (přepsat) nebo k nim přidat nové funkce.
Typy dědičnosti v C++
Níže jsou uvedeny různé typy dědičnosti, které C++ podporuje.
1. Jediné dědictví
Při jednoduché dědičnosti je podtřída odvozena pouze od jedné nadtřídy. Dědí vlastnosti a chování třídy s jedním rodičem. Někdy je také známá jako jednoduchá dědičnost.
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. Vícenásobná dědičnost
V Vícenásobná dědičnost jedna třída může mít více než jednu nadtřídu a dědit vlastnosti ze všech nadřazených tříd.
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. Víceúrovňová dědičnost
Víceúrovňová dědičnost v C++ znamená, že třída je odvozena od jiné odvozené třídy tvořící řetězec dědič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á dědičnost
V hierarchickém dědění je více než jedna podtřída zděděna z jedné základní třídy. tj. více než jedna odvozená třída je vytvořena z jedné základní třídy. Například auta a autobusy jsou vozidla.
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í dědičnost
Když jsou dva nebo více typů dědičnosti kombinovány v jednom programu. Třída může například používat vícenásobnou dědičnost a může být také součástí víceúrovňového řetězce dědič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í dědičnost může vést k diamantový problém v C++. K tomu dochází, když třída dědí ze dvou tříd, které obě sdílejí stejnou základní třídu. Výsledkem je, že odvozená třída získá více kopií členů základní třídy, což vytváří nejednoznačnost, kterou z nich použít.
Poznámka: Řešením je použití virtuální dědičnosti, takže je sdílena pouze jedna kopie základní třídy.
Výhody dědičnosti v C++
- Znovupoužitelnost kódu : Odvozená třída může přímo znovu používat datové členy a metody své základní třídy, aby se zabránilo duplicitě kódu.
- Abstrakce: Podporuje abstraktní třídy (třídy s čistě virtuálními funkcemi), které definují společné rozhraní vynucující abstrakci.
- Hierarchie tříd: Můžete vytvářet hierarchie (základní → odvozené → dále odvozené) pro modelování vztahů v reálném světě.
- Polymorfismus: Plně podporuje runtime polymorfismus prostřednictvím virtuálních funkcí a také polymorfismus v době kompilace prostřednictvím přetížení funkcí a šablon.
Nevýhody dědičnosti v C++
- Těsné spojení: Podřízená třída se stává závislou na rodičovské třídě. Jakákoli změna v základní třídě může vynutit změny v odvozených třídách.
- Snížená flexibilita: Někdy je dědičnost zneužita tam, kde by bylo lepší složení (má-vztah) vedlo k méně flexibilnímu kódu.
- Zvýšená složitost: Hluboké hierarchie dědičnosti (víceúrovňové nebo hybridní) mohou způsobit, že je obtížné porozumět údržbě a ladění kódu.
- Problém s diamanty: U hybridní nebo vícenásobné dědičnosti může dojít k nejednoznačnosti, pokud je stejná základní třída zděděna vícekrát.
- Režie virtuálních funkcí: Pokud je použit polymorfismus (virtuální funkce), dochází k malé režii běhu kvůli vyhledávání virtuálních tabulek.