Skip to main content

Wat is een virtuele functie?

Een virtuele functie is een functie, gedefinieerd in een superclass, die in een subklasse aanwezig moet zijn om die subklasse een volledige klassendefinitie te hebben.Virtuele functies zijn afhankelijk van 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 is gedefinieerd mdash;of overschreven, afhankelijk van of de functie in de superclass is gedefinieerd.

De virtuele functie kan op een van de 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 superclasss.

Er zijn voor- en nadelen voor beide methoden.Het definiëren van een functie als een stub zorgt ervoor dat alle subklassen er enige implementatie van hebben, zelfs als deze 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 nietVirtuele 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 klasse als functie, omdat deze erftDe definitie uit klasse B. Indien nodig kan klasse C klasse BS -functie overschrijven, of het kan klasse BS -functie 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 CB via G All moeten klasse hebben als virtuele functie op de een of andere manier gedefinieerd.Als klasse B een implementatie van AS -functie heeft, hebben klassen D en E deze niet nodig om opnieuw te worden gered.Misschien moeten CS -subklassen als functie 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 maken in 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.