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 at den underklassen skal ha en fullstendig klassedefinisjon. Virtuelle funksjoner er avhengige av et objektorientert programmeringsparadigme som kalles virtuell arv, som oftest sees i C ++ ved bruk av det "virtuelle" søkeordet. For å definere en virtuell funksjon er det nødvendig med to klasser, en superklasse og en underklasse. Superklassen er der funksjonen først blir erklært, og eventuelt definert. Underklassen er der funksjonen er definert - eller overstyres, avhengig av om funksjonen ble definert i superklassen.

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

Det er fordeler og ulemper med begge metodologiene. Å definere en funksjon som en stub sikrer at alle underklasser har en viss implementering av den, selv om den ikke gjør noe. Hvis man glemmer å overstyre funksjonen og implementere den ordentlig i en underklasse, vil det imidlertid ikke vises noen feil eller advarsler som peker på dette. Å definere en ren virtuell funksjon krever derimot hver underklasse å ha sin egen definisjon av funksjonen, og det vil vises feil hvis dette ikke er tilfelle.

Virtuelle funksjoner er imidlertid underlagt de samme arvereglene som ikke-virtuelle funksjoner, så arvelighetshierarkier med mer enn to nivåer trenger kanskje ikke 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 As funksjon, fordi den arver definisjonen fra klasse B. Om nødvendig kan klasse C overstyre klasse Bs funksjon, eller den kan overstyre klasse Bs funksjon mens den også kaller den.

Ytterligere trenger ikke virtuelle funksjoner å bli definert i en underklasse hvis de er erklært virtuelle i den underklassen. For eksempel kan man vurdere en klasse A som deklarerer en virtuell funksjon og har to underklasser, B og C. I tillegg kan man tenke seg at klasse B har underklasser D og E, og underklasse C har underklasser F og G.

Klassene B til G må alle ha klasse A's virtuelle funksjon definert på en eller annen måte. Hvis klasse B har en implementering av As funksjon, trenger ikke klasse D og E at den skal gjøres om. Kanskje Cs underklasser trenger å implementere As funksjon, men de gjør begge noe annerledes, så det å definere funksjonen i klasse C 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 å lære, men når de brukes riktig, kan de redusere kodeduplisering og gjøre koden mye enklere å forstå generelt. Det er imidlertid mange fallgruver med virtuelle funksjoner, spesielt når det gjelder 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

Hjalp denne artikkelen deg? Takk for tilbakemeldingen Takk for tilbakemeldingen

Hvordan kan vi hjelpe? Hvordan kan vi hjelpe?