GeeksforGeeks (Dansk)

en klasses evne til at udlede egenskaber og egenskaber fra en anden klasse kaldes arv. Arv er et af de vigtigste træk ved objektorienteret programmering.underklasse :den klasse, der arver egenskaber fra en anden klasse, kaldes underklasse eller afledt klasse.
Super klasse: den klasse, hvis egenskaber er arvet af underklasse kaldes Base klasse eller Super klasse.

artiklen er opdelt i følgende underemner:

  1. hvorfor og hvornår skal du bruge arv?,
  2. Arvsformer
  3. Arvstyper

hvorfor og hvornår skal du bruge arv?

overvej en gruppe køretøjer. Du skal oprette klasser for Bus, Bil og lastbil. Metoderne fuelAmount (), kapacitet (), applybremes () vil være ens for alle de tre klasser., Hvis vi skaber disse klasser undgå arv, så vi er nødt til at skrive alle disse funktioner i hver af de tre klasser, som vist i nedenstående figur:

Du kan tydeligt se, at ovenstående proces resulterer i gentagelser af samme kode 3 gange. Dette øger chancerne for fejl og dataredundans. For at undgå denne type situation anvendes arv., Hvis vi opretter et klassekøretøj og skriver disse tre funktioner i det og arver resten af klasserne fra køretøjsklassen, kan vi simpelthen undgå duplikering af data og øge genanvendeligheden. Kig på nedenstående diagram, hvor de tre klasser, der er nedarvet fra køretøjets klasse:

ved Hjælp af arv, vi er nødt til at skrive de funktioner, der kun én gang i stedet for tre gange som vi har arvet resten af de tre klasser fra basis-klasse(Køretøj).,

implementering af arv i C++: for at oprette en underklasse, der er arvet fra basisklassen, skal vi følge nedenstående syntaks.
syntaks:

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

Her er subclass_name navnet på underklassen, access_mode er den tilstand, hvor du vil arve denne underklasse for eksempel: offentlig, privat osv. og base_class_name er navnet på den basisklasse, hvorfra du vil arve underklassen.
bemærk: en afledt klasse arver ikke adgang til private data medlemmer., Imidlertid, det arver et fuldt forældreobjekt, som indeholder private medlemmer, som denne klasse erklærer.



Output:

Child id is 7Parent id is 91

I ovenstående program “Barn” – klasse, der er offentligt arvet fra ‘Forælder’ klasse, så de offentlige data, der er medlemmer af klassen ‘Samme’ vil også blive arvet af klassen “Barn”.

Arvsformer

  1. offentlig tilstand: hvis vi udleder en underklasse fra en offentlig basisklasse., Derefter bliver det offentlige medlem af basisklassen offentligt i den afledte klasse, og beskyttede medlemmer af basisklassen bliver beskyttet i afledt klasse.
  2. Beskyttet tilstand: hvis vi henter en underklasse fra en beskyttet baseklasse. Så bliver både offentligt medlem og beskyttede medlemmer af basisklassen beskyttet i afledt klasse.
  3. privat tilstand: hvis vi udleder en underklasse fra en privat baseklasse. Så bliver både offentligt medlem og beskyttede medlemmer af basisklassen privat I afledt klasse.,bemærk: de private medlemmer i basisklassen kan ikke tilgås direkte i den afledte klasse, mens beskyttede medlemmer kan tilgås direkte. For eksempel indeholder klasser B, C og D alle variablerne., y og. i nedenstående eksempel. Det er bare et spørgsmål om adgang.,

    tabellen nedenfor giver en oversigt over de tre ovennævnte tilstande og viser access anvisning af medlemmer af base klasse i sub-klasse, når de stammer i public, protected og private tilstande:

    Typer af Arv i C++

    Et særligt tilfælde af hybrid arv : Multipath arv:
    En afledt klasse med to stamklasser og disse to stamklasser har en fælles base klasse kaldes multipath arv. En tvetydighed kan arrise i denne type arv.,

    Overvej følgende program:

    
    

    
    

    Output:

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

    I ovenstående eksempel, både ClassB & ClassC arve ClassA, har de begge et enkelt eksemplar af ClassA. Men ClassD arve begge ClassB & ClassC, derfor ClassD har to kopier af ClassA, en fra ClassB og en anden fra ClassC.,
    Hvis vi har brug for at få adgang til de data, der er medlem af en af ClassA gennem objekt af ClassD, vi skal specificere, fra hvilken en vil du få adgang til, uanset om det er fra ClassB eller ClassC, bco ‘ z-værktøjslinien compileren ikke kan skelne mellem to kopier af ClassA i ClassD.
    Der er 2 måder at undgå denne tvetydighed:

    1. Brug anvendelsesområde resolution operator
    2. Brug virtual base class

    Undgå tvetydighed brug anvendelsesområde beslutning operatør:
    Brug anvendelsesområde beslutning operatøren vi kan manuelt angive den sti, hvorfra data et medlem vil være adgang til, som vist i sætning 3 og 4, i ovenstående eksempel.,

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

    
    

    
    

    Bemærk : der er Stadig to kopier af ClassA i ClassD.,
    at Undgå tvetydighed, der bruger virtuelle stamklasse:

    
    

    
    

    Output:

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

    i Henhold til ovenstående eksempel, ClassD har kun én kopi af ClassA, derfor, sætning 4 vil overskrive den værdi af a, givet ved udsagn 3.

    Denne artikel er bidraget af barske Agaralal. Hvis du kan lide GeeksforGeeks og gerne vil bidrage, kan du også skrive en artikel ved hjælp af contribute.geeksforgeeks.org eller mail din artikel til [email protected]., Se din artikel vises på GeeksforGeeks hovedsiden og hjælpe andre nørder.

    opmærksomhed læser! Stop ikke med at lære nu. Få fat i alle de vigtige C++ Foundation og STL koncepter med C++ Foundation og STL kurser på en studerende-venlig pris og blive industri klar.

    Artikel Tags :

    C++
    Praksis Tags :

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *