Наслеђивање у Ц++

Наслеђивање у Ц++

Наслеђе је основни концепт у ООП (Објектно оријентисано програмирање) . То је механизам којим је једној класи дозвољено да наследи карактеристике (поља и методе) друге класе. Наслеђивање подразумева креирање нових класа на основу постојећих. Класа која наслеђује другу класу може поново да користи методе и поља те класе.

Пример: У следећем примеру Анимал је основна класа, а Дог Цат и Цов су изведене класе које проширују класу Анимал.

анимал_цласс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  ;   }   

Излаз
Dog barks Cat meows Cow moos  

Објашњење:

  • Анимал је основна класа са функцијом соунд().
  • Дог Цат и Цов су изведене класе које дефинишу сопствени соунд() метод.
  • У маин() објекти Дог Цат и Цов се креирају одвојено.
  • Када позовемо соунд() на сваком објекту, покреће се одговарајућа метода деце (пас лаје Мачка мјауче Крава мучи).

Синтакса

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

Како наслеђивање функционише у Ц++?

Двотачка (:) са ан спецификација приступа се користи за наслеђивање у Ц++. Омогућава изведеној класи (подређеној класи) да наследи чланове података (поља) и функције чланова (методе) основне класе (родитељске класе).
Када класа наследи другу класу, она добија све доступне чланове родитељске класе, а подређена класа такође може да их редефинише (замени) или да им дода нову функционалност.

Типови наслеђивања у Ц++

наслеђе

Испод су различите врсте наслеђивања које подржава Ц++.

1. Појединачно наслеђе

У појединачном наслеђивању поткласа је изведена из само једне супер класе. Наслеђује својства и понашање једнородитељске класе. Понекад је познато и као једноставно наслеђивање.

наслеђе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  ;   }   

Излаз
This is a Vehicle This Vehicle is Car  

2. Вишеструко наслеђе

Ин Вишеструко наслеђе једна класа може имати више од једне суперкласе и наследити карактеристике свих родитељских класа.

Мултипле_инхеританце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  ;   }   

Излаз
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. Наслеђивање на више нивоа

Наслеђивање на више нивоа у Ц++ значи да је класа изведена из друге изведене класе формирајући ланац наслеђивања.

Мултилевел_инхеританце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  ;   }   

Излаз
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car  

4. Хијерархијско наслеђе

У хијерархијском наслеђивању више од једне подкласе се наслеђује из једне основне класе. тј. више од једне изведене класе се креира из једне основне класе. На пример, и аутомобили и аутобуси су возила.

хијерархијско_наслеђивање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  ;   }   

Излаз
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. Хибридно наслеђе

Када се у једном програму комбинују две или више врста наслеђивања. На пример, класа може користити вишеструко наслеђивање и такође бити део ланца наслеђивања на више нивоа.

хибридИнхеританце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  ;   }   

Излаз
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare 

Хибридно наслеђивање може довести до проблем са дијамантима у Ц++. Ово се дешава када класа наслеђује две класе које обе деле исту основну класу. Као резултат тога, изведена класа добија више копија чланова основне класе, што ствара нејасноћу о томе коју ће користити.

Напомена : Решење је коришћење виртуелног наслеђивања тако да се дели само једна копија основне класе.

Предности наслеђивања у Ц++

  • Поновна употреба кода : Изведена класа може директно поново користити чланове података и методе своје основне класе избегавајући дуплирање кода.
  • апстракција: Подржава апстрактне класе (класе са чистим виртуелним функцијама) које дефинишу заједнички интерфејс који спроводи апстракцију.
  • Хијерархија класа: Можете изградити хијерархије (база → изведено → даље изведено) за моделирање односа у стварном свету.
  • полиморфизам: Потпуно подржава полиморфизам времена извођења кроз виртуелне функције, као и полиморфизам у времену компајлирања преко преоптерећења функција и шаблона.

Недостаци наслеђивања у Ц++

  • Чврста спојница: Подређена класа постаје зависна од родитељске класе. Свака промена у основној класи може довести до промена у изведеним класама.
  • Смањена флексибилност: Понекад се наслеђивање злоупотребљава тамо где би композиција (има-однос) била боља што би довело до мање флексибилног кода.
  • Повећана сложеност: Дубоке хијерархије наслеђивања (вишестепене или хибридне) могу отежати разумевање код одржавања и отклањања грешака.
  • Проблем са дијамантима: Код хибридног или вишеструког наслеђивања може доћи до двосмислености ако се иста основна класа наслеђује више пута.
  • Износ виртуелних функција: Ако се користи полиморфизам (виртуелне функције), постоје мали трошкови времена рада због претраживања виртуелне табеле.
Креирај квиз