Wat is een virtuele functie?
Een virtuele functie is een functie, gedefinieerd in een superclass, die in een subklasse moet zijn voor die subklasse om een volledige klassendefinitie te hebben. Virtuele functies vertrouwen op een objectgeoriënteerd programmeerparadigma genaamd virtuele overerving, dat meestal wordt gezien in C ++ met behulp van het "virtuele" trefwoord. Om een virtuele functie te definiëren, zijn twee klassen nodig, een superclass en een subklasse. De superclass is waar de functie voor het eerst wordt verklaard en mogelijk wordt gedefinieerd. De subklasse is waar de functie wordt gedefinieerd - of opgeheven, afhankelijk van of de functie is gedefinieerd in de superclass.
De virtuele functie kan op een van twee manieren worden gedefinieerd. Ten eerste kan het worden gedefinieerd als een stub, waarin het een leeg lichaam heeft en niets doet. Ten tweede kan het worden gedefinieerd als een pure virtuele functie, waarbij het wordt gedefinieerd als nul in het koptekstbestand van de superclass.
Er zijn voor- en nadelen voor beide methoden. Het definiëren van een functie als een stub zorgt ervoor dat alle subklassen haVe een implementatie ervan, zelfs als het niets doet. Als men vergeet de functie te negeren en deze correct in een subklasse te implementeren, lijken er echter geen fouten of waarschuwingen op te wijzen. Het definiëren van een pure virtuele functie daarentegen vereist dat elke subklasse zijn eigen definitie van de functie heeft, en fouten verschijnen als dit niet het geval is.
Virtuele functies zijn echter onderworpen aan dezelfde erfenisregels als niet-virtuele functies, dus overervinghiërarchieën met meer dan twee niveaus vereisen mogelijk geen expliciete definities van virtuele functies. Men kan bijvoorbeeld een klasse A overwegen die een virtuele functie verklaart, die is geïmplementeerd in subklasse B. Klasse B heeft een eigen subklasse, Klasse C. Klasse C vereist geen expliciete definitie van de functie van klasse A, omdat het de definitie van klasse B van klasse B kan overnemen, kan klasse C de functie van klasse B overschrijven,Of het kan de functie van klasse B overschrijven terwijl het ook wordt aangeroepen.
Aan de andere kant hoeven virtuele functies niet in een subklasse te worden gedefinieerd als ze in die subklasse virtueel worden verklaard. Men kan bijvoorbeeld een klasse A overwegen die een virtuele functie verklaart en twee subklassen heeft, B en C. Bovendien zou men zich kunnen voorstellen dat klasse B subklassen D en E heeft, en subklasse C heeft subklassen F en G.
KLASSEN B DOOR G MOET ALLEN Klasse A's virtuele functie op de een of andere manier gedefinieerd. Als klasse B een implementatie van de functie van A heeft, hebben klassen D en E deze niet nodig om opnieuw te worden gered. Misschien moeten C's subklassen de functie van A implementeren, maar ze doen allebei iets anders, dus het definiëren van de functie in klasse C zelf zou niet nuttig zijn. In dat geval kan de functie virtueel worden verklaard in klasse C, en een implementatie is niet nodig.
Virtuele functies kunnen ontmoedigend zijn om te leren, maar wanneer ze correct worden gebruikt, kunnen ze code -duplicatie verminderen en code veel gemakkelijker te begrijpen makenin het algemeen. Er zijn echter veel valkuilen met virtuele functies, vooral met betrekking tot meerdere overerving. In meervoudige overerving is het mogelijk om dubbelzinnig gedefinieerde virtuele functies met elkaar te conflicteren, zodat ze in die context met voorzichtigheid moeten worden gebruikt.