Hvad er en virtuel funktion?
En virtuel funktion er en funktion, der er defineret i en superklasse, der skal være til stede i en underklasse for at underklassen skal have 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 deklareres og muligvis defineres. Underklassen er hvor funktionen er defineret - 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 den defineres som en ren virtuel funktion, hvor den er defineret som NULL i superklassens overskriftsfil.
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 der imidlertid ingen fejl eller advarsler ud til at påpege dette. Definition af en ren virtuel funktion kræver på den anden side, at hver underklasse har sin egen definition af funktionen, og der vises fejl, hvis dette ikke er tilfældet.
Virtuelle funktioner er dog underlagt de samme arveregler som ikke-virtuelle funktioner, så arvehierarkier med mere end to niveauer kræver muligvis ikke eksplicit definition af virtuelle funktioner. For eksempel kan man overveje en klasse A, der erklærer en virtuel funktion, der er implementeret i underklasse B. Klasse B har en egen underklasse, klasse C. Klasse C kræver ikke en eksplicit definition af klasse A's funktion, fordi den arver definitionen fra klasse B. Om nødvendigt kunne klasse C tilsidesætte klasse B's funktion, eller den kan tilsidesætte klasse B's funktion, mens den også kalder den.
I den anden ekstreme behøver virtuelle funktioner ikke at blive defineret i en underklasse, hvis de erklæres virtuelle 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.
Klasse B til G skal alle have klasse A's virtuelle funktion defineret på en eller anden måde. Hvis klasse B har en implementering af A's funktion, behøver ikke klasse D og E, at den skal gøres om. Måske er C's underklasser nødt til at implementere A's funktion, men de gør begge ting noget andet, så det ville ikke være nyttigt at definere funktionen i klasse C selv. I dette tilfælde kan funktionen erklæres 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 duplikering af koden og gøre koden meget lettere at forstå generelt. Der er imidlertid mange faldgruber med virtuelle funktioner, især hvad angår flere arv. Ved flere arv er det muligt for tvetydigt definerede virtuelle funktioner at komme i konflikt med hinanden, så de bør bruges med forsigtighed i den sammenhæng.