Nasljeđivanje u C++

Nasljeđivanje u C++

Nasljeđe je temeljni koncept u OOP (objektno orijentirano programiranje) . To je mehanizam kojim je jednoj klasi dopušteno naslijediti značajke (polja i metode) druge klase. Nasljeđivanje znači stvaranje novih klasa na temelju postojećih. Klasa koja nasljeđuje drugu klasu može ponovno koristiti metode i polja te klase.

Primjer: U sljedećem primjeru Animal je osnovna klasa, a Dog Cat i Cow su izvedene klase koje proširuju klasu Animal.

životinjska_klasaInheritance 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  ;   }   

Izlaz
Dog barks Cat meows Cow moos  

Obrazloženje:

  • Animal je osnovna klasa s funkcijom sound().
  • Pas Mačka i Krava su izvedene klase od kojih svaka definira vlastitu metodu sound().
  • U main() objekti Dog Cat i Cow kreiraju se odvojeno.
  • Kada pozovemo sound() na svakom objektu, izvodi se odgovarajuća metoda podređene klase (pas laje, mačka mjauče, krava muče).

Sintaksa

C++
   class     ChildClass     :     public     ParentClass   {      // Additional fields and methods   };   

Kako funkcionira nasljeđivanje u C++?

Dvotočka (:) s an specifikator pristupa koristi se za nasljeđivanje u C++. Omogućuje izvedenoj klasi (klasi dijete) da naslijedi članove podataka (polja) i funkcije članice (metode) osnovne klase (klase roditelja).
Kada klasa naslijedi drugu klasu, ona dobiva sve dostupne članove roditeljske klase, a podređena klasa ih također može redefinirati (nadjačati) ili im dodati novu funkcionalnost.

Vrste nasljeđivanja u C++

nasljedstvo

Ispod su različite vrste nasljeđivanja koje podržava C++.

1. Jedno nasljeđivanje

Kod jednostrukog nasljeđivanja potklasa je izvedena iz samo jedne super klase. Nasljeđuje svojstva i ponašanje jednoroditeljske klase. Ponekad je poznato i kao jednostavno nasljeđivanje.

nasljedstvoSingle 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  ;   }   

Izlaz
This is a Vehicle This Vehicle is Car  

2. Višestruko nasljeđivanje

U Višestruko nasljeđivanje jedna klasa može imati više od jedne superklase i naslijediti značajke od svih roditeljskih klasa.

Višestruko_nasljeđivanjeMultiple 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  ;   }   

Izlaz
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. Višerazinsko nasljeđivanje

Višerazinsko nasljeđivanje u C++ znači da je klasa izvedena iz druge izvedene klase tvoreći lanac nasljeđivanja.

Višerazinsko_nasljeđivanjeMultilevel 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  ;   }   

Izlaz
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car  

4. Hijerarhijsko nasljeđivanje

U hijerarhijskom nasljeđivanju više od jedne podklase nasljeđuje se iz jedne osnovne klase. tj. više od jedne izvedene klase stvara se iz jedne osnovne klase. Na primjer, i automobili i autobusi su vozila.

hijerarhijsko_nasljeđivanjeHierarchical 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  ;   }   

Izlaz
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. Hibridno nasljeđivanje

Kada se dvije ili više vrsta nasljeđivanja kombiniraju u jednom programu. Na primjer, klasa može koristiti višestruko nasljeđivanje i također biti dio višerazinskog lanca nasljeđivanja.

hibridno nasljeđeHybrid 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  ;   }   

Izlaz
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare 

Hibridno nasljeđe može dovesti do dijamantni problem u C++. To se događa kada klasa nasljeđuje dvije klase koje obje dijele istu osnovnu klasu. Kao rezultat toga, izvedena klasa dobiva višestruke kopije članova osnovne klase što stvara dvosmislenost oko toga koju koristiti.

Napomena: Rješenje je korištenje virtualnog nasljeđivanja tako da se dijeli samo jedna kopija osnovne klase.

Prednosti nasljeđivanja u C++

  • Mogućnost ponovne upotrebe koda : Izvedena klasa može izravno ponovno koristiti članove podataka i metode svoje osnovne klase izbjegavajući dupliciranje koda.
  • Apstrakcija: Podržava apstraktne klase (klase s čistim virtualnim funkcijama) koje definiraju zajedničko sučelje koje provodi apstrakciju.
  • Hijerarhija klasa: Možete izgraditi hijerarhije (osnova → izvedeno → dalje izvedeno) za modeliranje odnosa u stvarnom svijetu.
  • Polimorfizam: U potpunosti podržava polimorfizam vremena izvođenja putem virtualnih funkcija i također polimorfizam vremena kompajliranja putem preopterećenja funkcija i predložaka.

Nedostaci nasljeđivanja u C++

  • Čvrsto spajanje: Klasa dijete postaje ovisna o klasi roditelju. Svaka promjena u osnovnoj klasi može nametnuti promjene u izvedenim klasama.
  • Smanjena fleksibilnost: Ponekad se nasljeđivanje zlorabi tamo gdje bi sastav (ima-odnos) bio bolji što dovodi do manje fleksibilnog koda.
  • Povećana složenost: Duboke hijerarhije nasljeđivanja (višerazinske ili hibridne) mogu učiniti kod teškim za razumijevanje održavanja i otklanjanja pogrešaka.
  • Problem dijamanta: Kod hibridnog ili višestrukog nasljeđivanja može doći do dvosmislenosti ako se ista osnovna klasa nasljeđuje više puta.
  • Opterećenje virtualnih funkcija: Ako se koristi polimorfizam (virtualne funkcije), dolazi do malog vremena izvođenja zbog traženja virtualne tablice.
Napravi kviz