Arv i C++

Arv i C++

Arv er et grunnleggende begrep i OOP (objektorientert programmering) . Det er mekanismen som en klasse får lov til å arve funksjonene (felt og metoder) til en annen klasse. Arv betyr å lage nye klasser basert på eksisterende. En klasse som arver fra en annen klasse kan gjenbruke metodene og feltene til den klassen.

Eksempel: I det følgende eksemplet er dyr basisklassen og hund, katt og ku er avledede klasser som utvider dyreklassen.

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

Produksjon
Dog barks Cat meows Cow moos  

Forklaring:

  • Animal er basisklassen med en funksjon sound().
  • Dog Cat og Cow er avledede klasser som definerer hver sin lyd()-metode.
  • I main() opprettes objekter til Dog Cat og Cow separat.
  • Når vi kaller sound() på hvert objekt kjører den respektive barneklassemetoden (Hund bjeffer Katt mjauer Cow moos).

Syntaks

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

Hvordan arv fungerer i C++?

Kolon (:) med en tilgangsspesifikasjoner brukes for arv i C++. Den lar den avledede klassen (underordnet klasse) arve datamedlemmene (feltene) og medlemsfunksjonene (metodene) til basisklassen (overordnet klasse).
Når en klasse arver en annen klasse, får den alle de tilgjengelige medlemmene av den overordnede klassen, og barneklassen kan også redefinere (overstyre) eller legge til ny funksjonalitet til dem.

Typer av arv i C++

arv

Nedenfor er de forskjellige typer arv som støttes av C++.

1. Enkeltarv

I enkeltarv er en underklasse avledet fra bare en superklasse. Den arver egenskapene og oppførselen til en enkeltforelderklasse. Noen ganger er det også kjent som enkel arv.

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

Produksjon
This is a Vehicle This Vehicle is Car  

2. Multippel arv

I Multippel arv én klasse kan ha mer enn én superklasse og arve funksjoner fra alle overordnede klasser.

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

Produksjon
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. Flernivåarv

Flernivåarv i C++ betyr at en klasse er avledet fra en annen avledet klasse som danner en arvekjede.

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

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

4. Hierarkisk arv

I hierarkisk arv arves mer enn én underklasse fra en enkelt basisklasse. dvs. mer enn én avledet klasse er opprettet fra en enkelt basisklasse. For eksempel er både biler og busser kjøretøy.

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

Produksjon
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. Hybrid arv

Når to eller flere typer arv er kombinert i ett program. For eksempel kan en klasse bruke multippel arv og også være en del av en multilevel arvskjede.

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

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

Hybrid arv kan føre til diamantproblem i C++. Dette skjer når en klasse arver fra to klasser som begge deler samme grunnklasse. Som et resultat får den avledede klassen flere kopier av basisklassemedlemmene, noe som skaper tvetydighet om hvilken som skal brukes.

Merk: Løsningen er å bruke virtuell arv slik at bare en enkelt kopi av basisklassen deles.

Fordeler med arv i C++

  • Kode Gjenbrukbarhet : Avledet klasse kan direkte gjenbruke datamedlemmer og metoder for sin basisklasse for å unngå kodeduplisering.
  • Abstraksjon: Støtter abstrakte klasser (klasser med rene virtuelle funksjoner) som definerer et felles grensesnitt som håndhever abstraksjon.
  • Klassehierarki: Du kan bygge hierarkier (base → avledet → videre avledet) for å modellere relasjoner i den virkelige verden.
  • Polymorfisme: Støtter fullt kjøretidspolymorfisme gjennom virtuelle funksjoner og også kompileringstidspolymorfisme via funksjonsoverbelastning og maler.

Ulemper med arv i C++

  • Tett kobling: Barneklassen blir avhengig av foreldreklassen. Enhver endring i basisklassen kan fremtvinge endringer i avledede klasser.
  • Redusert fleksibilitet: Noen ganger misbrukes arv der sammensetning (har et forhold) bedre ville føre til mindre fleksibel kode.
  • Økt kompleksitet: Dype arvehierarkier (flernivå eller hybrid) kan gjøre koden vanskelig å forstå, vedlikeholde og feilsøke.
  • Diamantproblem: Med hybrid eller multippel arv kan tvetydighet oppstå hvis den samme baseklassen arves flere ganger.
  • Overhead av virtuelle funksjoner: Hvis polymorfisme (virtuelle funksjoner) brukes, er det en liten driftstid på grunn av virtuelle tabelloppslag.
Lag quiz