Dědičnost v C++

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.

zvířecí_třídaInheritance 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++

dědictví

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.

dědictví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.

Vícenásobná_dědičnostMultiple 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.

Víceúrovňová_dědičnostMultilevel 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.

hierarchická_dědičnostHierarchical 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.

hybridní dědičnostHybrid 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.
Vytvořit kvíz