Kaj je virtualno dedovanje?

Navidezno dedovanje je vrsta dedovanja, pri kateri je izvedba nadrazreda nepopolna, za popolno definicijo predmeta pa je potreben podrazred. Ta vrsta dedovanja se lahko uporablja v povezavi z enojnim in večkratnim dedovanjem, vendar se najpogosteje uporablja pri večkratnem dedovanju. Vsak razred, ki podeduje od navideznega osnovnega razreda, postane neposredni podrazred tega osnovnega razreda. Navidezni osnovni razred se lahko zanaša na podrazred za izvajanje vseh svojih metod, vendar to ni pogoj.

C++ je najpogosteje znan računalniški jezik za uporabo navideznega dedovanja. Za deklariranje navideznega dedovanja v C++ se uporablja ključna beseda »virtual«. Tako nadrazred kot podrazred morata deklarirati virtualne metode s ključno besedo »virtual«. To prevajalniku C++ pove, da je nadrazred nepopoln in mora za dokončanje pridobiti informacije od podrazreda. Uporaba podrazreda za dokončanje nadrazreda ne pomeni, da podrazredi prepišejo drug drugega, če imajo isti osnovni razred, namesto tega pa prevajalnik C++ poskrbi za določanje, kateri deli gredo k posameznemu objektu.

Ker je za navidezno dedovanje potreben navidezni osnovni razred, globalnih funkcij v C++ ni mogoče razglasiti za navidezne. Ta tip dedovanja se lahko uporablja samo, če se držimo načel objektno usmerjenega programiranja (OOP). Razlog za to je, da globalne funkcije niso povezane z določenim razredom in so zato običajno samostojne. Brez nadrazreda in podrazreda se dedovanje ne more zgoditi, zato se globalne funkcije in virtualno dedovanje medsebojno izključujeta. Globalne funkcije se teoretično lahko uporabljajo znotraj virtualnih funkcij, vendar obratno morda ne deluje vedno.

Navidezno dedovanje se uporablja za reševanje številnih programskih problemov, eden izmed najbolj uporabnih pa je razreševanje nejasnosti. Pri večkratnem dedovanju ima lahko osnovni razred A, ki ima dva podrazreda, B in C, in nato razred D, ki podeduje iz obeh razredov B in C. Ta vzorec se običajno imenuje »diamant smrti«, ker če razredi A, B in C imata implementacije iste metode, zato razred D ne more določiti, katero izvedbo naj uporabi. Navidezno dedovanje rešuje ta problem, ker izvedba vsakega razreda ostaja ločena in zato nedvoumna. To razlikovanje obravnavajo specializirani notranji predmeti, imenovane navidezne tabele (vtables), ki spremljajo vsako vrsto objekta, vendar programerju ni treba, da jih izrecno manipulira s temi tabelami, ker so vgrajene v jezik.