Hva er en virtuell funksjon?

En virtuell funksjon er en funksjon, definert i en superklasse, som må være til stede i en underklasse for den underklassen for å ha en komplett klassedefinisjon. Virtuelle funksjoner er avhengige av et objektorientert programmeringsparadigme kalt virtuell arv, som oftest sees i C ++ ved å bruke det "virtuelle" nøkkelordet. For å definere en virtuell funksjon, er to klasser nødvendige, en superklasse og en underklasse. Superklassen er der funksjonen først blir erklært og muligens definert. Underklassen er der funksjonen er definert - eller overstyrt, avhengig av om funksjonen ble definert i superklassen.

Den virtuelle funksjonen kan defineres på en av to måter. For det første kan det defineres som en stubbe, der den har en tom kropp og ikke gjør noe. For det andre kan det defineres som en ren virtuell funksjon, der den er definert som null i Superclass's headerfil.

Det er fordeler og ulemper med begge metodologier. Definere en funksjon som en stubhar noe implementering av det, selv om det ikke gjør noe. Hvis man glemmer å overstyre funksjonen og implementere den ordentlig i en underklasse, vil imidlertid ingen feil eller advarsler se ut til å påpeke dette. Å definere en ren virtuell funksjon, derimot, krever at hver underklasse har sin egen definisjon av funksjonen, og feil vises hvis dette ikke er tilfelle.

Virtuelle funksjoner er imidlertid underlagt de samme arvereglene som ikke-virtuelle funksjoner, så arvehierarkier med mer enn to nivåer kan ikke kreve eksplisitte definisjoner av virtuelle funksjoner. For eksempel kan man ta hensyneller det kan overstyre klasse Bs funksjon mens den også kaller den.

På de andre ekstreme, trenger ikke virtuelle funksjoner å defineres i en underklasse hvis de er erklært virtuelle i den underklassen. For eksempel kan man vurdere en klasse A som erklærer en virtuell funksjon og har to underklasser, B og C. I tillegg kan man forestille seg at klasse B har underklasser D og E, og underklasse C har underklasser F og G.

Klasser B gjennom G alle må ha klasse As virtuelle funksjon definert på en eller annen måte. Hvis klasse B har en implementering av As funksjon, trenger ikke klasser D og E at den skal gjøres om. Kanskje Cs underklasser trenger å implementere As funksjon, men de gjør begge noe annerledes, så å definere funksjonen i klasse C i seg selv ville ikke være nyttig. I så fall kan funksjonen erklæres virtuell i klasse C, og en implementering er ikke nødvendig.

Virtuelle funksjoner kan være skremmende for å lære, men når de brukes riktig, kan de redusere kodeduplisering og gjøre koden mye enklere å forståGenerelt. Det er mange fallgruver med virtuelle funksjoner, spesielt angående flere arv. I flere arv er det mulig for tvetydig definerte virtuelle funksjoner å komme i konflikt med hverandre, så de bør brukes med forsiktighet i den sammenhengen.

ANDRE SPRÅK