Wat is virtuele erfenis?
Virtuele erfenis is een type overerving waarin de implementatie van een superclass onvolledig is en een subklasse vereist is voor volledige definitie van een object. Dit type overerving kan worden gebruikt in combinatie met zowel enkele als meerdere overerving, maar wordt meestal gebruikt in meerdere overerving. Elke klasse die van een virtuele basisklasse erft, 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 erfenis te gebruiken. Om virtuele erfenis in C ++ te verklaren, wordt het "virtuele" trefwoord gebruikt. Zowel de superclass als de subklasse moeten virtuele methoden verklaren met het "virtuele" trefwoord. Dit vertelt de C ++ compiler dat de superclass onvolledig is en dat het informatie van de subklasse moet krijgen om deze te voltooien. Het gebruik van de subklasse om de superclass te voltooien betekent niet dat subklassen elkaar overschrijven als ze deDezelfde basisklasse, en in plaats daarvan zorgt de C ++ compiler voor om te bepalen welke stukken bij elk object gaan.
Aangezien een virtuele basisklasse vereist is voor virtuele erfenis, kunnen globale functies in C ++ niet virtueel worden verklaard. Dit erfenistype kan alleen worden gebruikt bij het hechten aan de principes van objectgeoriënteerde programmering (OOP). De reden hiervoor is dat globale functies niet worden geassocieerd met een bepaalde klasse, en dus meestal alleen op zichzelf staan. Zonder een superclass en subklasse overerving kan niet gebeuren, zijn globale functies en virtuele erfenis elkaar uitsluiten. Globale functies kunnen in theorie worden gebruikt in virtuele functies, maar het omgekeerde werkt misschien niet altijd.
Virtuele erfenis wordt gebruikt om veel programmeerproblemen op te lossen, en een van de meest bruikbare is het oplossen van dubbelzinnigheid. In meervoudige erfenis kan men een basisklasse A hebben met twee subklassen, B enC, en vervolgens een klasse D die erft van beide klassen B en C. Dit patroon wordt gewoonlijk de "Diamond of Death" genoemd, want als klassen A, B en C allemaal implementaties van dezelfde methode hebben, is het niet mogelijk voor klasse D om te bepalen welke implementatie het zou moeten gebruiken. Virtuele erfenis lost dit probleem op omdat de implementatie van elke klasse duidelijk en daarom ondubbelzinnig blijft. Dit onderscheid wordt afgehandeld door gespecialiseerde interne objecten genaamd virtuele tabellen (VTABLE) die elk objecttype bijhouden, maar deze tabellen hoeven niet expliciet te worden gemanipuleerd door een programmeur omdat ze in de taal zijn ingebouwd.