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 den underklasse for at 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 er erklæret og muligvis defineret. 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 det defineres som en ren virtuel funktion, hvor den defineres som null i Superclass's header -fil.

Der er fordele og ulemper ved begge metoder. Definition af en funktion som en stub sikrer, at alle underklasser haVi har en vis implementering af det, selvom det 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 imidlertid underlagt de samme arvsregler som ikke-virtuelle funktioner, så arvshierarkier med mere end to niveauer kræver muligvis ikke eksplicitte definitioner af virtuelle funktioner. For eksempel kan man overveje en klasse A, der erklærer en virtuel funktion, der implementeres 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 kan klasse C tilsidesætte klasse B's funktion,Eller det kunne tilsidesætte klasse B's funktion, mens den også kalder den.

På de andre ekstreme behøver virtuelle funktioner ikke 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.

Klasser B til G alle skal have klasse A's virtuelle funktion defineret på en eller anden måde. Hvis klasse B har en implementering af A's funktion, har klasser D og E ikke brug for, at den skal redoneres. Måske er C's underklasser nødt til at implementere A's 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 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 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.

ANDRE SPROG

Hjalp denne artikel dig? tak for tilbagemeldingen tak for tilbagemeldingen

Hvordan kan vi hjælpe? Hvordan kan vi hjælpe?