Skip to main content

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 bruk av 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 og mdash;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 superklassen overskriftsfilen.

Det er fordeler og ulemper med begge metodologier.Å definere en funksjon som en stubbe sikrer at alle underklasser har en viss implementering av den, 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 vil 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 vurdere en klasse A som erklærer en virtuell funksjon, som er implementert i underklasse B. Klasse B har en egen underklasse, klasse C. Klasse C krever ikke en eksplisitt definisjon av klasse som funksjon, fordi den arverDefinisjonen fra klasse B. Om nødvendig kan klasse C overstyre klasse BS -funksjon, eller den kan overstyre klasse BS -funksjon mens den også kalte 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.

-klasserB gjennom G alle må ha klasse som virtuell funksjon definert på en eller annen måte.Hvis klasse B har en implementering av AS -funksjon, trenger ikke klasser D og E den for å bli gjort om.Kanskje CS -underklasser trenger å implementere som 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 kodedobbelisering 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.