GeeksforGeeks

De mogelijkheid van een klasse om eigenschappen en kenmerken af te leiden van een andere klasse wordt overerving genoemd. Overerving is een van de belangrijkste kenmerken van objectgeoriënteerd programmeren.
subklasse: de klasse die eigenschappen erft van een andere klasse wordt subklasse of afgeleide klasse genoemd.
superklasse: de klasse waarvan de eigenschappen worden overgenomen door subklasse wordt basisklasse of superklasse genoemd.

het artikel is onderverdeeld in de volgende subonderwerpen:

  1. waarom en wanneer overerving gebruiken?,
  2. wijzen van overerving
  3. typen overerving

waarom en wanneer overerving gebruiken?

beschouw een groep voertuigen. Je moet klassen voor Bus, auto en vrachtwagen te creëren. De methoden fuelAmount (), capacity (), applyBrakes () zullen voor alle drie de klassen hetzelfde zijn., Als we deze klassen maken om overerving te vermijden, dan moeten we al deze functies in elk van de drie klassen schrijven, zoals getoond in onderstaande figuur:

u kunt duidelijk zien dat het bovenstaande proces resulteert in duplicatie van dezelfde code 3 keer. Dit verhoogt de kans op fouten en data redundantie. Om dit soort situaties te voorkomen, wordt overerving gebruikt., Als we een klasse voertuig te creëren en schrijven deze drie functies in het en erven de rest van de klassen van de voertuigklasse, dan kunnen we gewoon voorkomen dat de duplicatie van gegevens en verhoging van herbruikbaarheid. Kijk naar het onderstaande diagram waarin de drie klassen van voertuigklasse worden geërfd:

met overerving moeten we de functies slechts één keer schrijven in plaats van drie keer, aangezien we rest van de drie klassen van basisklasse(voertuig) hebben geërfd.,

implementatie van overerving in C++: Voor het maken van een subklasse die wordt overgenomen van de basisklasse moeten we de onderstaande syntaxis volgen.gebruik:

class subclass_name : access_mode base_class_name{ //body of subclass};

Hier is subclass_name de naam van de subklasse, access_mode is de modus waarin u deze subklasse wilt erven, bijvoorbeeld: public, private etc. en base_class_name is de naam van de basisklasse waarvan u de subklasse wilt erven.
opmerking: een afgeleide klasse erft geen toegang tot privégegevens leden., Het erft echter wel een volledig ouderobject, dat alle privé-leden bevat die die klasse declareert.



Output:

Child id is 7Parent id is 91

in het bovenstaande programma wordt de ‘Child’ – klasse publiekelijk overgenomen van de ‘Parent’ – klasse, zodat de publieke data-leden van de klasse ‘ouder’ zal ook worden geërfd door de klasse ‘kind’.

overerving

  1. Openbare modus: als we een subklasse afleiden uit een openbare basisklasse., Dan zal het publieke lid van de basisklasse publiek worden in de afgeleide klasse en zullen beschermde leden van de basisklasse beschermd worden in afgeleide klasse.
  2. Protected mode: als we een subklasse afleiden uit een beschermde basisklasse. Dan worden zowel publieke leden als beschermde leden van de basisklasse beschermd in afgeleide klasse.
  3. Private mode: als we een subklasse afleiden uit een private base class. Dan worden zowel publieke leden als beschermde leden van de basisklasse privé in afgeleide klasse.,

opmerking: de privé-leden in de basisklasse kunnen niet direct benaderd worden in de afgeleide klasse, terwijl beschermde leden direct benaderd kunnen worden. Bijvoorbeeld, de klassen B, C en D bevatten allemaal de variabelen x, y en z in onderstaand voorbeeld. Het is slechts een kwestie van toegang.,

de onderstaande tabel geeft een samenvatting van de drie bovenstaande modi en toont de toegangsspecificatie van de leden van de basisklasse in de subklasse wanneer afgeleid in publieke, beschermde en private modi:

typen overerving in c++

een speciaal geval van hybride overerving : Multipath overerving:
a afgeleid klasse met twee basisklassen en deze twee basisklassen hebben één gemeenschappelijke basisklasse wordt Multipath overerving genoemd. Een dubbelzinnigheid kan Arris in dit type van overerving.,

Beschouw het volgende programma:



Output:

A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40

In het bovenstaande voorbeeld, zowel ClassB & ClassC erven klasse-a, ze hebben allebei één exemplaar van klasse-a. ClassD erft echter beide ClassB & ClassC, daarom heeft ClassD twee kopieën van ClassA, een van ClassB en een van ClassC.,
als we toegang moeten krijgen tot het data lid A van ClassA via het object van ClassD, moeten we het pad specificeren van waaruit a benaderd zal worden, of het nu van ClassB of ClassC is, BCO ‘ z compiler kan geen onderscheid maken tussen twee kopieën van ClassA in ClassD.
er zijn 2 manieren om deze dubbelzinnigheid te vermijden:

  1. gebruik scope resolution operator
  2. gebruik virtuele basisklasse

vermijden van dubbelzinnigheid met scope resolution operator:
Gebruik scope resolution operator we kunnen handmatig het pad specificeren van waaruit data lid a zal worden benaderd, zoals getoond in statement 3 en 4, in het bovenstaande voorbeeld.,

obj.ClassB::a = 10;
obj.ClassC::a = 100;



Opmerking : er zijn twee exemplaren van klasse-a in ClassD.,
dubbelzinnigheid vermijden met behulp van virtuele basisklasse:



uitvoer:

A : 100B : 20C : 30D : 40

volgens het bovenstaande voorbeeld heeft ClassD slechts één kopie van classa, dus statement 4 zal de waarde van A overschrijven, gegeven bij statement 3.

Dit artikel is geschreven door Harsh Agarwal. Als je GeeksforGeeks leuk vindt en wil bijdragen, kun je ook een artikel schrijven met contribute.geeksforgeeks.org of mail uw artikel naar [email protected]., Zie je artikel verschijnen op de GeeksforGeeks hoofdpagina en help andere Geeks.

Attentie lezer! Stop nu niet met leren. Haal alle belangrijke C++ Foundation en STL concepten in handen met de C++ Foundation en STL cursussen tegen een student-vriendelijke prijs en word klaar voor de industrie.

Article Tags:

C++
Practice Tags:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *