For å utføre programmene angående “C ++ Diamond Arv” i Linux -operativsystemet, må du ha et Ubuntu -system installert og kjører på den virtuelle maskinen. To verktøy brukes. Den ene er et hvilket som helst redigeringsverktøy, og som sådan vil vi bruke standard "Text Editor" av Linux. Du kan bruke andre foretrukne redigeringsverktøy. Den andre er Ubuntu -terminalen. Som du vil kjøre programmet og kan se utdataene som vises.
Først vil vi diskutere flere arv i artikkelen, ettersom "diamantproblemet" oppstår i tilfelle å ha arv i kildekoden.
Flere arv i C++
Når vi snakker om bruken av klasser hierarkisk i programmet, kjenner vi alltid OOP (objektorientert programmering). Fordi denne arven er et viktig trekk ved objektorientert, der en underklasse er i stand til å arve fra en eller flere superklasser. På denne måten har en barneklasse to eller flere foreldre.
For eksempel, hvis en mor og far har et barn i et virkelig livsscenario, vil barnet arve alt fra foreldrene. Så dette barnet er kjent for å være en avledet klasse med mor og far som foreldre. La oss gå tilbake mot flere arv. Vi vil bruke "konstruktører" som en del av vår nåværende diskusjon. Konstruktørene av en arvelig klasse (barneklasse) i flere arv utfør ved å følge deres arvelige ordre. Mens for destruktørene er ordren omvendt av arven. Nå vil vi sitere et enkelt eksempel for å demonstrere arvenes funksjonalitet i C++.
Eksempel på flere arv
Tenk på et eksempel der det er to klasser, klasse A og klasse B, som foreldreklasse, og disse to klassene har en barneklasse som heter klasse C. Denne klassen er en avledet klasse av begge foreldrene. Vi vil bruke en konstruktør i den offentlige delen av hver klasse.
Det første trinnet i koden er å bruke et bibliotek for å tillate inngangsutgangsstrømming:
Da må vi erklære klasse A, ha konstruktørene med navnet på klassen. Som du vet at konstruktører er erklært med navnet på den klassen, og disse kalles når objektet opprettes. I konstruktøren er det vist en enkel melding som viser hvilken klassekonstruktør som blir utført. Nå definerer vi klasse B med samme tilnærming. Etter begge foreldreklassene er barneklassen nevnt.
En ting som bør bemerkes her er rekkefølgen på foreldreklasser barnet arver fordi denne ordren vil gjøre noe på tidspunktet for konstruksjonsutførelse og en melding som viser.
Nå, i hovedklassen, vil vi lage et objekt i barneklassen. Siden det har flere arv, er det ikke nødvendig å lage objektet for foreldreklassen. De blir automatisk utført på grunn av barneklasseobjektet:
Int main ()
C C;
Retur 0;
Etter å ha skrevet den forrige koden i Text Editor, lagrer du denne filen med utvidelsen av '.C '. Vi vil utføre filen i Ubuntu -terminalen. For utførelsesformålet er en kompilator påkrevd. I C ++ bruker vi en G ++ kompilator. Ellers trenger du først å installere det:
$ G ++ -o m1 m1.c
$ ./M1
Bruk G ++ med navnet på filen som har kildekoden og den du vil vise utdataene. Merk, -o brukes til å lagre utdataene. Siden klasse B arves over klasse A, så konstruktøren blir utført først, kan du se utdataene fra forrige bilde.
Ettersom arvsbegrepet er klart nå, vil vi diskutere "diamantproblemet" her.
Diamantproblem
Et diamantproblem er bare en sak i flere arv som oppstår når en barneklasse har verdiene som er arvet fra de to foreldrene. Hvor disse foreldreklassene arves fra en felles besteforeldre -klasse.
Tenk for eksempel på et eksempel der vi har en barneklasse arvet fra klassene til mor og far. Disse klassene arver en tredje klasse som heter “Person”:
Barn> Mor> Person
> Far> person
Så ifølge det gitte scenariet arver barneklassen "personen" -klassen to ganger i programmet. En gang er det fra moren, og igjen, andre gang er fra faren. Dette skaper forvirring for kompilatoren å utføre hvilken konstruktør først. Denne situasjonen forårsaker en diamantformet arvegraf. Derfor er det kjent som "diamantproblemet".
Kodetilnærmingen er nesten den samme. Forklar baseklassen og deretter to arvelige barn (mor, far) klasser i baseklassen. Hver klasse blir fulgt av konstruktøren med en variabel for å lagre en verdi i den:
Nå, introduserer barneklassen:
# Klassebarn: Public Father, Public Mother
Barnklassen vil arve begge foreldreklassene. Hovedfunksjonen vil bruke objektet til barnet og en verdi i parameteren til konstruktøranropet:
Etter å ha lagret koden, er det på tide å bruke kompilatoren til utførelsen og se resultatet:
Nå kan du observere at baseklassen kalles to ganger. Dette er et diamantproblem. Etter å ha beskrevet problemet, vil vi nå finne en mulig løsning.
Løsning av diamantproblem
Løsningen avhenger av bruken av nøkkelordet “Virtual”. To-foreldre-klasser med en felles baseklasse vil nå arve baseklassen praktisk talt for å minimere forekomsten av kopier av baseklassen i barneklassen. Nå vil vi endre koden ved å bruke det nøkkelordet:
Hver gang foreldreklassen arver fra besteforeldreklassen, brukes "virtuell", men bare med foreldrene, ikke for et barn. Dette er "den virtuelle arven". Det begrenser bortgangen til mer enn en enkelt forekomst fra baseklassen som skal sendes.
# Klasse Far: Virtuell offentlig person
Nå vil vi utføre koden. De resulterende verdiene viser at tvetydighet fjernes ved hjelp av dette konseptet:
For å unngå repetisjon av basekonstruktøren som skal kalles, oppnås ikke konstruktøren for en virtuell baseklasse gjennom klassen som har arvet den. Imidlertid kalles denne konstruktøren fra betongklassekonstruktøren. I det nåværende eksemplet kaller barneklassen "personen" -klassekonstruktøren direkte.
Konklusjon
“C ++ diamantproblem” er en artikkel skrevet for å fjerne tvetydigheten i baseklassen repetisjon i flere arv. Arvbegrepet forklares kort med eksempler. Tilsvarende er årsaken og løsningen for diamantproblemet også utdypet i detalj. Vi håper denne opplæringen kan gi deg veiledning innen C ++ -programmer.