Skip to main content

Hvad er en virtuel funktion?

En virtuel funktion er en funktion, defineret i en superklasse, der skal være til stede i en underklasse for at underklassen har en komplet klassedefinition.Virtuelle funktioner er afhængige af et objektorienteret programmeringsparadigme kaldet virtuel arv, som oftest ses i C ++ ved hjælp af det virtuelle nøgleord.For at definere en virtuel funktion er to klasser nødvendige, en superklasse og en underklasse.Superklassen er, hvor funktionen først er erklæret og muligvis defineret.Underklassen er, hvor funktionen er defineret mdash;eller tilsidesat, afhængigt af om funktionen blev defineret i superklassen.

Den virtuelle funktion kan defineres på en af to måder.For det første kan det defineres som en stub, hvor den har en tom krop og ikke gør noget.For det andet kunne det defineres som en ren virtuel funktion, hvor den defineres som null i SuperClasss -headerfilen.

Der er fordele og ulemper ved begge metoder.Definition af en funktion som en stub sikrer, at alle underklasser har en vis implementering af den, selvom den ikke gør noget.Hvis man glemmer at tilsidesætte funktionen og implementere den korrekt i en underklasse, ser det imidlertid ikke ud til, at der er nogen fejl eller advarsler.Definition af en ren virtuel funktion kræver på den anden side, at hver underklasse har sin egen definition af funktionen, og fejl vises, hvis dette ikke er tilfældet.

Virtuelle funktioner er dog underlagt de samme arvsregler som ikke-ikke-Virtuelle funktioner, så arvshierarkier med mere end to niveauer kræver muligvis ikke eksplicitte definitioner af virtuelle funktioner.F.eksDefinitionen fra klasse B. Om nødvendigt kunne klasse C tilsidesætte klasse BS -funktion, eller den kunne tilsidesætte klasse BS -funktion, mens den også kalder den.

På de andre ekstreme behøver virtuelle funktioner ikke at defineres i en underklasse, hvis de erklæres virtuel i denne underklasse.For eksempel kan man overveje en klasse A, der erklærer en virtuel funktion og har to underklasser, B og C. Derudover kunne man forestille sig, at klasse B har underklasser D og E, og underklasse C har underklasser F og G.

klasserB til G alle skal have klasse som virtuel funktion defineret på en eller anden måde.Hvis klasse B har en implementering af AS -funktion, behøver klasser D og E ikke det for at blive gjort om.Måske behøver CS -underklasser at implementere som funktion, men de gør begge noget andet, så at definere funktionen i selve klasse C ville ikke være nyttig.I dette tilfælde kan funktionen blive erklæret virtuel i klasse C, og en implementering er ikke nødvendig.

Virtuelle funktioner kan være skræmmende at lære, men når de bruges korrekt, kan de reducere kodeduplikation og gøre kode meget lettere at forstå generelt.Der er dog mange faldgruber med virtuelle funktioner, især vedrørende flere arv.I flere arv er det muligt for tvetydigt definerede virtuelle funktioner at komme i konflikt med hinanden, så de skal bruges med forsigtighed i den sammenhæng.