Wat is virtueel erfdeel?
Virtuele overerving is een soort overerving waarbij de implementatie van een superklasse onvolledig is en een subklasse is vereist voor de volledige definitie van een object. Dit type overerving kan worden gebruikt in combinatie met zowel enkele als meervoudige overerving, maar wordt meestal gebruikt bij meervoudige overerving. Elke klasse die erft van een virtuele basisklasse wordt een directe subklasse van die basisklasse. Een virtuele basisklasse kan op een subklasse vertrouwen om al zijn methoden te implementeren, maar dit is geen vereiste.
C ++ is de meest bekende computertaal om virtuele overerving te gebruiken. Om virtuele overerving in C ++ aan te geven, wordt het trefwoord "virtueel" gebruikt. Zowel de superklasse als de subklasse moeten virtuele methoden declareren met het trefwoord "virtueel". Dit vertelt de C ++ -compiler dat de superklasse onvolledig is en dat deze informatie van de subklasse moet ophalen om deze te voltooien. Het gebruik van de subklasse om de superklasse te voltooien, betekent niet dat subklassen elkaar overschrijven als ze dezelfde basisklasse hebben, en in plaats daarvan bepaalt de C ++ compiler welke stukken bij elk object horen.
Aangezien een virtuele basisklasse vereist is voor virtuele overerving, kunnen globale functies in C ++ niet als virtueel worden verklaard. Dit overervingstype kan alleen worden gebruikt bij het volgen van object-georiënteerde programmeer (OOP) principes. De reden hiervoor is dat globale functies niet geassocieerd zijn met een bepaalde klasse, en dus meestal op zichzelf staan. Zonder een superklasse en subklasse kan er geen overerving plaatsvinden, dus globale functies en virtuele overerving sluiten elkaar uit. Globale functies kunnen in theorie worden gebruikt in virtuele functies, maar het omgekeerde werkt mogelijk niet altijd.
Virtuele overerving wordt gebruikt om veel programmeerproblemen op te lossen en een van de nuttigste is het oplossen van dubbelzinnigheden. Bij meervoudige overerving kan men een basisklasse A hebben die twee subklassen heeft, B en C, en vervolgens een klasse D die ervaart van beide klassen B en C. Dit patroon wordt gewoonlijk de "diamanten des doods" genoemd, want als klassen A, B en C hebben allemaal implementaties van dezelfde methode, het is niet mogelijk voor klasse D om te bepalen welke implementatie het moet gebruiken. Virtuele overerving lost dit probleem op omdat de implementatie van elke klasse verschillend en daarom ondubbelzinnig blijft. Dit onderscheid wordt gemaakt door gespecialiseerde interne objecten die virtuele tabellen (vtables) worden genoemd en die elk objecttype bijhouden, maar deze tabellen hoeven niet expliciet door een programmeur te worden gemanipuleerd omdat ze in de taal zijn ingebouwd.