Kaj je virtualna funkcija?

Navidezna funkcija je funkcija, definirana v nadrazredu, ki mora biti prisotna v podrazredu, da ima ta podrazred popolno definicijo razreda. Navidezne funkcije se zanašajo na objektno usmerjeno programsko paradigmo, imenovano virtualno dedovanje, ki je najpogosteje vidna v C++ z uporabo ključne besede »virtual«. Za definiranje virtualne funkcije sta potrebna dva razreda, nadrazred in podrazred. Nadrazred je mesto, kjer je funkcija najprej deklarirana in po možnosti definirana. Podrazred je tam, kjer je funkcija definirana – ali preglašena, odvisno od tega, ali je bila funkcija definirana v nadrazredu.

Virtualno funkcijo je mogoče definirati na enega od dveh načinov. Prvič, lahko ga definiramo kot škrbino, v kateri ima prazno telo in ne dela ničesar. Drugič, lahko bi ga definirali kot čisto navidezno funkcijo, kjer je v datoteki glave nadrazreda definirana kot NULL.

Obe metodologiji imata prednosti in slabosti. Definiranje funkcije kot škrbine zagotavlja, da imajo vsi podrazredi neko njeno implementacijo, tudi če ne naredi ničesar. Če pozabite preglasiti funkcijo in jo pravilno implementirati v podrazred, se ne bodo pojavile napake ali opozorila, ki bi to opozorila. Definiranje čiste navidezne funkcije pa zahteva, da ima vsak podrazred svojo definicijo funkcije, in če temu ni tako, se bodo pojavile napake.

Za virtualne funkcije pa veljajo enaka pravila o dedovanju kot za nevirtualne funkcije, zato hierarhije dedovanja z več kot dvema nivojema morda ne bodo zahtevale izrecnih definicij virtualnih funkcij. Na primer, lahko razmislimo o razredu A, ki deklarira virtualno funkcijo, ki je implementirana v podrazredu B. Razred B ima svoj podrazred, razred C. Razred C ne zahteva izrecne definicije funkcije razreda A, ker podeduje definicijo iz razreda B. Če je potrebno, bi lahko razred C preglasil funkcijo razreda B ali pa bi lahko preglasil funkcijo razreda B, hkrati pa jo poklical.

Na drugi strani pa virtualnih funkcij ni treba definirati v podrazredu, če so v tem podrazredu razglašene za navidezne. Na primer, lahko razmislimo o razredu A, ki deklarira virtualno funkcijo in ima dva podrazreda, B in C. Poleg tega si lahko predstavljamo, da ima razred B podrazreda D in E, podrazred C pa podrazreda F in G.

Vsi razredi B do G morajo imeti navidezno funkcijo razreda A nekako definirano. Če ima razred B implementacijo funkcije A, je razredom D in E ni treba preoblikovati. Morda morajo podrazredi C implementirati funkcijo A, vendar oba delata nekaj drugega, tako da definiranje funkcije v razredu C ne bi bilo uporabno. V tem primeru se lahko funkcija razglasi za virtualno v razredu C in izvedba ni potrebna.
Navidezne funkcije je lahko zastrašujoče za učenje, vendar lahko ob pravilni uporabi zmanjšajo podvajanje kode in na splošno olajšajo razumevanje kode. Vendar pa obstaja veliko pasti z virtualnimi funkcijami, zlasti v zvezi z večkratnim dedovanjem. Pri večkratnem dedovanju je možno, da dvoumno definirane navidezne funkcije nasprotujejo med seboj, zato jih je treba v tem kontekstu uporabljati previdno.