Hvad er virtuel arv?
Virtuel arv er en type arv, hvor implementeringen af en superklasse er ufuldstændig, og der kræves en underklasse til fuldstændig definition af et objekt. Denne arvtype kan bruges i forbindelse med både enkelt og multippel arv, men er mest almindeligt anvendt i multipel arv. Enhver klasse, der arver fra en virtuel baseklasse, bliver en direkte underklasse for denne baseklasse. En virtuel baseklasse kan være afhængig af en underklasse til at implementere alle dens metoder, men dette er ikke et krav.
C ++ er det mest almindeligt kendte computersprog til at bruge virtuel arv. For at erklære virtuel arv i C ++ bruges det "virtuelle" nøgleord. Både superklassen og underklassen 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 fuldføre den. Brug af underklassen til at færdiggøre superklassen betyder ikke, at underklasser overskriver hinanden, hvis de har den samme baseklasse, og i stedet sørger C ++ -kompileren til at bestemme, hvilke stykker der passer til hvert objekt.
Da der kræves en virtuel baseklasse til virtuel arv, kan globale funktioner i C ++ ikke erklæres virtuelle. Denne arvtype kan kun bruges, når man overholder objektorienteret programmering (OOP) -principper. Årsagen hertil er, at globale funktioner ikke er forbundet med en bestemt klasse, og at de normalt selvforsyner med dem selv. Uden en superklasse og underklasse kan arv ikke ske, så globale funktioner og virtuel arv er gensidigt eksklusive. Globale funktioner kan i teorien bruges i 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 løsning af tvetydighed. I flere arver kan man have en baseklasse A, der har to underklasser, B og C, og derefter en klasse D, der arver fra begge klasser B og C. Dette mønster kaldes almindeligvis "dødens diamant", fordi hvis klasser A, 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 adskilt 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 programmerer, fordi de er indbygget i sproget.