Paveldėjimas C++

Paveldėjimas C++

Paveldėjimas yra pagrindinė sąvoka OOP (objektinis programavimas) . Tai mechanizmas, kuriuo vienai klasei leidžiama paveldėti kitos klasės ypatybes (laukus ir metodus). Paveldėjimas reiškia naujų klasių kūrimą remiantis esamomis. Klasė, kuri paveldima iš kitos klasės, gali pakartotinai naudoti tos klasės metodus ir laukus.

Pavyzdys: Toliau pateiktame pavyzdyje Gyvūnas yra pagrindinė klasė, o šunų katė ir karvė yra išvestinės klasės, kurios praplečia gyvūnų klasę.

gyvūnų_klasė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  ;   }   

Išvestis
Dog barks Cat meows Cow moos  

Paaiškinimas:

  • Gyvūnas yra pagrindinė klasė su funkcija sound().
  • „Dog Cat“ ir „Cow“ yra išvestinės klasės, kiekviena apibrėžianti savo garso () metodą.
  • Pagrindiniame() šunų katės ir karvės objektai kuriami atskirai.
  • Kai iškviečiame garsą () kiekviename objekte, paleidžiamas atitinkamas antrinės klasės metodas (šuo loja Katė miauka karvė moos).

Sintaksė

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

Kaip paveldėjimas veikia C++?

Dvitaškis (:) su an prieigos specifikatorius naudojamas paveldėjimui C++. Tai leidžia išvestinei klasei (antrinei klasei) paveldėti bazinės klasės (pagrindinės klasės) duomenų narius (laukus) ir narių funkcijas (metodus).
Kai klasė paveldi kitą klasę, ji gauna visus pasiekiamus pagrindinės klasės narius, o antrinė klasė taip pat gali iš naujo apibrėžti (nepaisyti) arba pridėti prie jų naujų funkcijų.

Paveldėjimo tipai C++

paveldėjimo

Žemiau pateikiami įvairūs paveldėjimo tipai, kuriuos palaiko C++.

1. Vienkartinis paveldėjimas

Vieno paveldėjimo atveju poklasis yra kilęs tik iš vienos superklasės. Jis paveldi vienos iš tėvų klasės savybes ir elgesį. Kartais tai taip pat žinoma kaip paprastas paveldėjimas.

paveldėjimasSingle 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  ;   }   

Išvestis
This is a Vehicle This Vehicle is Car  

2. Daugybinis paveldėjimas

Į Daugialypis paveldėjimas viena klasė gali turėti daugiau nei vieną superklasę ir paveldėti funkcijas iš visų pirminių klasių.

Daugybinis_paveldėjimasMultiple 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  ;   }   

Išvestis
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. Daugiapakopis paveldėjimas

Daugiapakopis paveldėjimas C++ reiškia, kad klasė yra kilusi iš kitos išvestinės klasės, sudarančios paveldėjimo grandinę.

Daugiapakopis_paveldėjimasMultilevel 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  ;   }   

Išvestis
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car  

4. Hierarchinis paveldėjimas

Hierarchinio paveldėjimo atveju daugiau nei vienas poklasis yra paveldimas iš vienos bazinės klasės. y., iš vienos bazinės klasės sukuriama daugiau nei viena išvestinė klasė. Pavyzdžiui, automobiliai ir autobusai yra transporto priemonės.

hierarchinis_paveldėjimasHierarchical 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  ;   }   

Išvestis
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. Hibridinis paveldėjimas

Kai vienoje programoje sujungiami du ar daugiau paveldėjimo rūšių. Pavyzdžiui, klasė gali naudoti daugialypį paveldėjimą ir taip pat būti kelių lygių paveldėjimo grandinės dalimi.

hibridas PaveldėjimasHybrid 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  ;   }   

Išvestis
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare 

Hibridinis paveldėjimas gali sukelti deimantų problema C++ kalboje. Taip atsitinka, kai klasė paveldi iš dviejų klasių, kurios abi turi tą pačią bazinę klasę. Dėl to išvestinė klasė gauna kelias bazinės klasės narių kopijas, todėl kyla neaiškumų, kurį iš jų naudoti.

Pastaba: Sprendimas yra naudoti virtualų paveldėjimą, kad būtų bendrinama tik viena pagrindinės klasės kopija.

Paveldėjimo privalumai C++

  • Kodo pakartotinis naudojimas : Išvestinė klasė gali tiesiogiai pakartotinai naudoti savo bazinės klasės duomenų narius ir metodus, išvengiant kodo dubliavimo.
  • Abstrakcija: Palaiko abstrakčias klases (klases su grynomis virtualiomis funkcijomis), kurios apibrėžia bendrą sąsają, užtikrinančią abstrakciją.
  • Klasės hierarchija: Galite sukurti hierarchijas (bazė → išvestinė → toliau išvestinė), kad modeliuotumėte realaus pasaulio ryšius.
  • Polimorfizmas: Visiškai palaiko vykdymo laiko polimorfizmą per virtualias funkcijas ir kompiliavimo laiko polimorfizmą per funkcijų perkrovą ir šablonus.

C++ paveldėjimo trūkumai

  • Tvirtas sujungimas: Vaikų klasė tampa priklausoma nuo tėvų klasės. Bet koks bazinės klasės pakeitimas gali priversti pakeisti išvestines klases.
  • Sumažintas lankstumas: Kartais paveldėjimas naudojamas netinkamai, kai sudėtis (santykis turi) būtų geriau, todėl kodas būtų mažiau lankstus.
  • Padidėjęs sudėtingumas: Dėl gilios paveldėjimo hierarchijos (daugiapakopių arba hibridinių) kodo priežiūra ir derinimas gali būti sunkiai suprantamas.
  • Deimantų problema: Hibridinio ar daugybinio paveldėjimo atveju gali atsirasti dviprasmybių, jei ta pati bazinė klasė paveldima kelis kartus.
  • Virtualių funkcijų pridėtinė vertė: Jei naudojamas polimorfizmas (virtualios funkcijos), dėl virtualios lentelės peržvalgų susidaro nedidelė vykdymo trukmė.
Sukurti viktoriną