Dedičnosť v C++

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.

animal_classInheritance 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++

dedičstvo

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.

dedeniaSingle 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.

Viacnásobné_dedenieMultiple 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.

Viacúrovňová_dedičnosť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á.

hierarchické_dedičstvoHierarchical 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 DedičstvoHybrid 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.
Vytvoriť kvíz