Skip to main content

Hvad er virtuel arv?

Virtuel arv er en type arv, hvor implementeringen af en superklasse er ufuldstændig, og en underklasse er påkrævet for komplet definition af et objekt.Denne type arv kan bruges i forbindelse med både enkelt og multiple arv, men bruges oftest i flere arv.Enhver klasse, der arver fra en virtuel baseklasse, bliver en direkte underklasse af denne baseklasse.En virtuel baseklasse kan stole på en underklasse for at implementere alle dens metoder, men dette er ikke et krav.

C ++ er det mest kendte computersprog til at bruge virtuel arv.For at erklære virtuel arv i C ++ bruges det virtuelle nøgleord.Både superklasse og underklasse skal erklære virtuelle metoder med det virtuelle nøgleord.Dette fortæller C ++ -kompilatoren, at superklassen er ufuldstændig, og den skal få information fra underklassen for at afslutte den.Brug af underklassen til at fuldføre superklassen betyder ikke, at underklasser overskriver hinanden, hvis de har den samme baseklasse, og i stedet tager C ++ -kompilatorArv, globale funktioner i C ++ kan ikke erklæres virtuel.Denne arvstype kan kun bruges, når man overholder objektorienterede programmeringsprincipper (OOP).Årsagen til dette er, at globale funktioner ikke er forbundet med en bestemt klasse, og det er normalt selvstændige på egen hånd.Uden en superklasse og underklassearv kan ikke ske, så globale funktioner og virtuel arv er gensidigt eksklusive.Globale funktioner kan i teorien bruges inden for virtuelle funktioner, men det modsatte fungerer muligvis ikke altid.

Virtuel arv bruges til at løse mange programmeringsproblemer, og en af de mest nyttige er opløsning af tvetydighed.I flere arv kan man have en basisklasse A, der har to underklasser, B og C, og derefter en klasse D, der arver fra både klasser B og C. Dette mønster kaldes almindeligvis dødsdiamanten, fordi hvis klasser A, B, B,og C har alle implementeringer af den samme metode, det er ikke muligt for klasse D at bestemme, hvilken implementering den skal bruge.Virtuel arv løser dette problem, fordi hver klasses implementering forbliver tydelig og derfor entydig.Denne sondring håndteres af specialiserede interne objekter kaldet virtuelle tabeller (VTables), der holder styr på hver objekttype, men disse tabeller behøver ikke eksplicit manipuleres af en programmør, fordi de er indbygget i sproget.