Наследяване в 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. Хибридно наследяване

Когато два или повече вида наследство се комбинират в една програма. Например един клас може да използва множествено наследяване и също да бъде част от многостепенна верига за наследяване.

хибридно наследяване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 

Хибридното наследяване може да доведе до проблем с диаманти в C++. Това се случва, когато един клас наследява от два класа, които споделят един и същ базов клас. В резултат на това производният клас получава множество копия на членовете на базовия клас, което създава неяснота кой от тях да се използва.

Забележка: Решението е да се използва виртуално наследяване, така че да се споделя само едно копие на базовия клас.

Предимства на наследяването в C++

  • Повторна употреба на кода : Произведеният клас може директно да използва повторно членовете на данните и методите на своя базов клас, като избягва дублирането на код.
  • Абстракция: Поддържа абстрактни класове (класове с чисти виртуални функции), които дефинират общ интерфейс, налагащ абстракция.
  • Йерархия на класа: Можете да изградите йерархии (базова → извлечена → допълнително извлечена), за да моделирате връзки в реалния свят.
  • Полиморфизъм: Напълно поддържа полиморфизъм по време на изпълнение чрез виртуални функции, както и полиморфизъм по време на компилиране чрез претоварване на функции и шаблони.

Недостатъци на наследяването в C++

  • Плътно свързване: Дъщерният клас става зависим от родителския клас. Всяка промяна в базовия клас може да наложи промени в производните класове.
  • Намалена гъвкавост: Понякога наследяването се използва неправилно, когато композицията (има връзка) би била по-добра, водеща до по-малко гъвкав код.
  • Повишена сложност: Дълбоките йерархии на наследяване (многостепенни или хибридни) могат да направят кода труден за разбиране, поддръжка и отстраняване на грешки.
  • Проблем с диаманта: При хибридно или множествено наследяване може да възникне неяснота, ако един и същ базов клас се наследи многократно.
  • Разход на виртуални функции: Ако се използва полиморфизъм (виртуални функции), има малко време за изпълнение поради търсене на виртуална таблица.
Създаване на тест