Спадкування в C++

Спадкування в C++

Спадковість є фундаментальним поняттям в ООП (об'єктно-орієнтоване програмування) . Це механізм, за допомогою якого одному класу дозволяється успадковувати функції (поля та методи) іншого класу. Успадкування означає створення нових класів на основі існуючих. Клас, який успадковує від іншого класу, може повторно використовувати методи та поля цього класу.

приклад: У наступному прикладі Animal є базовим класом, а Dog Cat і Cow є похідними класами, які розширюють клас 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  ;   }   

Вихід
Dog barks Cat meows Cow moos  

Пояснення:

  • Animal є базовим класом із функцією sound().
  • Dog Cat і Cow є похідними класами, кожен з яких визначає власний метод sound().
  • У main() об’єкти Dog Cat і Cow створюються окремо.
  • Коли ми викликаємо sound() для кожного об’єкта, виконується відповідний метод дочірнього класу (Собака гавкає, Кіт нявкає, Корова мигне).

Синтаксис

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

Як працює успадкування в C++?

Двокрапка (:) з an специфікатор доступу використовується для успадкування в C++. Це дозволяє похідному класу (класу-дочірньому) успадковувати члени даних (поля) і функції-члени (методи) базового класу (класу-батька).
Коли клас успадковує інший клас, він отримує всі доступні члени батьківського класу, а дочірній клас також може перевизначити (замінити) або додати до них нові функції.

Типи успадкування в C++

успадкування

Нижче наведено різні типи успадкування, які підтримуються C++.

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. Багаторівневе успадкування

Багаторівневе успадкування в C++ означає, що клас є похідним від іншого похідного класу, утворюючи ланцюжок успадкування.

Багаторівневе_спадкування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. Гібридне успадкування

Коли в одній програмі поєднуються два або більше типів успадкування. Наприклад, клас може використовувати множинне успадкування, а також бути частиною багаторівневого ланцюга успадкування.

hybridInheritanceHybrid 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 

Гібридне успадкування може призвести до алмазна проблема на C++. Це трапляється, коли клас успадковується від двох класів, які мають спільний базовий клас. У результаті похідний клас отримує кілька копій членів базового класу, що створює неоднозначність щодо того, який з них використовувати.

Примітка: Рішення полягає у використанні віртуального успадкування, щоб спільно використовувати лише одну копію базового класу.

Переваги успадкування в C++

  • Повторне використання коду : Похідний клас може безпосередньо повторно використовувати члени даних і методи свого базового класу, уникаючи дублювання коду.
  • Абстракція: Підтримує абстрактні класи (класи з чистими віртуальними функціями), які визначають загальний інтерфейс, що забезпечує абстракцію.
  • Ієрархія класів: Ви можете будувати ієрархії (базова → похідна → подальша похідна) для моделювання зв’язків у реальному світі.
  • Поліморфізм: Повністю підтримує поліморфізм часу виконання через віртуальні функції, а також поліморфізм під час компіляції через перевантаження функцій і шаблони.

Недоліки успадкування в C++

  • Жорстке зчеплення: Дочірній клас стає залежним від батьківського класу. Будь-яка зміна в базовому класі може викликати зміни в похідних класах.
  • Знижена гнучкість: Іноді успадкування використовується неправильно, коли композиція (відношення має) була б кращою, що призвело б до менш гнучкого коду.
  • Підвищена складність: Глибокі ієрархії успадкування (багаторівневі або гібридні) можуть ускладнити розуміння коду, підтримувати та налагоджувати.
  • Алмазна проблема: З гібридним або множинним успадкуванням неоднозначність може виникнути, якщо той самий базовий клас успадковується кілька разів.
  • Накладні витрати на віртуальні функції: Якщо використовується поліморфізм (віртуальні функції), виникає невеликий час виконання через пошук віртуальної таблиці.
Створіть вікторину