Hva er virtuell arv?

Virtuell arv er en type arv der implementeringen av en superklasse er ufullstendig, og en underklasse er nødvendig for fullstendig definisjon av et objekt. Denne arvstypen kan brukes i forbindelse med både enkelt og multippel arv, men brukes ofte i multippel arv. Enhver klasse som arver fra en virtuell baseklasse blir en direkte underklasse av den baseklassen. En virtuell baseklasse kan stole på en underklasse for å implementere alle metodene, men dette er ikke et krav.

C ++ er det mest kjente dataspråket som bruker virtuell arv. For å erklære virtuell arv i C ++ brukes det "virtuelle" nøkkelordet. Både superklassen og underklassen må erklære virtuelle metoder med det "virtuelle" nøkkelordet. Dette forteller C ++ -kompilatoren at superklassen er ufullstendig, og den må få informasjon fra underklassen for å fullføre den. Å bruke underklassen for å fullføre superklassen betyr ikke at underklasser overskriver hverandre hvis de har samme baseklasse, og i stedet sørger C ++ -kompilatoren for å bestemme hvilke stykker som går med hvert objekt.

Siden det kreves en virtuell baseklasse for virtuell arv, kan ikke globale funksjoner i C ++ erklæres virtuelle. Denne arvstypen kan bare brukes når man overholder objektorienterte programmeringsprinsipper (OOP). Årsaken til dette er at globale funksjoner ikke er assosiert med en bestemt klasse, og at de vanligvis er selvforsynt på egen hånd. Uten en superklasse og underklasse kan arv ikke skje, så globale funksjoner og virtuell arv er gjensidig utelukkende. Globale funksjoner kan i teorien brukes i virtuelle funksjoner, men det motsatte fungerer kanskje ikke alltid.

Virtuell arv brukes til å løse mange programmeringsproblemer, og en av de mest nyttige er oppløsningen av tvetydighet. I flere arver kan man ha en baseklasse A som har to underklasser, B og C, og deretter en klasse D som arver fra begge klasser B og C. Dette mønsteret kalles ofte "dødens diamant" fordi hvis klasse A, B og C har alle implementeringer av samme metode, det er ikke mulig for klasse D å bestemme hvilken implementering den skal bruke. Virtuell arv løser dette problemet fordi implementering av hver klasse forblir distinkt og derfor entydig. Denne skillet håndteres av spesialiserte interne objekter kalt virtuelle tabeller (vtables) som holder rede på hver objekttype, men disse tabellene trenger ikke å eksplisitt manipuleres av en programmerer fordi de er innebygd i språket.

ANDRE SPRÅK

Hjalp denne artikkelen deg? Takk for tilbakemeldingen Takk for tilbakemeldingen

Hvordan kan vi hjelpe? Hvordan kan vi hjelpe?