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.
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 ; }
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++
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.
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 ; }
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.
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 ; }
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 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.
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 ; }
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.
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 ; }
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.