Skip to main content

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 typen arv kan brukes i forbindelse med både enkelt og flere arv, men brukes ofte i flere 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 for å bruke virtuell arv.For å erklære virtuell arv i C ++, brukes det virtuelle søkeordet.Både superklassen og underklassen må erklære virtuelle metoder med det virtuelle søkeordet.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 tar C ++ -kompilatoren seg av å bestemme hvilke brikker som går med hvert objekt.

Siden en virtuell baseklasse er nødvendig for virtuellArv, globale funksjoner i C ++ kan ikke erklæres virtuell.Denne arvtypen kan bare brukes når du følger med objektorientert programmering (OOP) -prinsipper.Årsaken til dette er at globale funksjoner ikke er assosiert med en bestemt klasse, og at de vanligvis er selvstendige på egen hånd.Uten en superklasse og underklasse -arv kan 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øsning av tvetydighet.I flere arv kan man ha en baseklasse A som har to underklasser, B og C, og deretter en klasse D som arver fra både klasse 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 implementeringen av hver klasser forblir distinkt, og derfor entydig.Denne skillet håndteres av spesialiserte interne objekter som kalles virtuelle tabeller (VTables) som holder oversikt over hver objekttype, men disse tabellene trenger ikke å bli eksplisitt manipulert av en programmerer fordi de er innebygd i språket.