Što je virtualno nasljeđivanje?

Virtualno nasljeđivanje je vrsta nasljeđivanja u kojoj je implementacija nadklase nepotpuna, a potklasa je potrebna za potpunu definiciju objekta. Ova vrsta nasljeđivanja može se koristiti u kombinaciji s pojedinačnim i višestrukim nasljeđivanjem, ali se najčešće koristi u višestrukom nasljeđivanju. Svaka klasa koja nasljeđuje od virtualne osnovne klase postaje izravna podklasa te osnovne klase. Virtualna osnovna klasa može se oslanjati na podklasu za implementaciju svih svojih metoda, ali to nije uvjet.

C++ je najčešće poznati računalni jezik za korištenje virtualnog nasljeđivanja. Za deklariranje virtualnog nasljeđivanja u C++, koristi se ključna riječ “virtual”. I superklasa i podklasa moraju deklarirati virtualne metode s ključnom riječi “virtual”. To govori C++ prevoditelju da je nadklasa nepotpuna i mora dobiti informacije od potklase da bi je dovršio. Korištenje podklase za dovršavanje nadklase ne znači da podklase prepisuju jedna drugu ako imaju istu osnovnu klasu, a umjesto toga C++ prevodilac brine o određivanju dijelova koji idu uz svaki objekt.

Budući da je virtualna osnovna klasa potrebna za virtualno nasljeđivanje, globalne funkcije u C++ ne mogu se proglasiti virtualnim. Ovaj tip nasljeđivanja može se koristiti samo ako se pridržavate principa objektno orijentiranog programiranja (OOP). Razlog za to je taj što globalne funkcije nisu povezane s određenom klasom, pa su obično same za sebe. Bez nadklase i podklase nasljeđivanje se ne može dogoditi, pa se globalne funkcije i virtualno nasljeđivanje međusobno isključuju. Globalne funkcije se u teoriji mogu koristiti unutar virtualnih funkcija, ali obrnuto ne mora uvijek funkcionirati.

Virtualno nasljeđivanje se koristi za rješavanje mnogih programskih problema, a jedan od najkorisnijih je rješavanje nejasnoća. U višestrukom nasljeđivanju, netko može imati osnovnu klasu A koja ima dvije podklase, B i C, a zatim klasu D koja nasljeđuje obje klase B i C. Ovaj obrazac se obično naziva “dijamant smrti” jer ako klase A, B i C imaju implementacije iste metode, nije moguće da klasa D odredi koju implementaciju treba koristiti. Virtualno nasljeđivanje rješava ovaj problem jer implementacija svake klase ostaje različita i stoga nedvosmislena. Ovom razlikom upravljaju specijalizirani interni objekti koji se nazivaju virtualne tablice (vtables) koje prate svaki tip objekta, ali tim tablicama ne treba eksplicitno manipulirati programer jer su ugrađene u jezik.