Kas yra virtuali klasė?

Virtuali klasė yra klasė, kuri atmintyje paskirstoma tik vieną kartą, todėl tos klasės vaikai naudoja tik vieną atmintyje sukurtą pirminės klasės kopiją. Klasė yra objektų, turinčių bendrų bruožų ar atributų, grupė. Klasės pavertimas virtualia į objektą orientuotoms programavimo kalboms suteikia galimybę naudoti daugkartinį paveldėjimą, kai antrosios ar daugiau kartos pirminės klasės yra išvestos iš bendrų protėvių bazinių klasių. Priklausomai nuo nurodytos kompiuterio programavimo kalbos, „virtualus“ raktinis žodis, panašus raktinis žodis arba klasės sintaksė ir semantika yra naudojami nurodant, kad tam tikra klasė turi būti laikoma virtualia.

Ne visos objektinės programavimo kalbos leidžia kelis kartus paveldėti, tai yra tada, kai antrinė klasė gali būti išvesta iš kelių pirminių klasių vienu metu. Programavimo kalboje, pvz., C++, klasė gali paveldėti visus narių duomenis ir narių funkcijas iš abiejų pirminių klasių vienu metu ir turėti prieigą prie abiejų pirminių duomenų ir funkcijų rinkinių. Kitos kalbos, palaikančios daugialypį paveldėjimą, yra Perl, Python, Tcl ir Eiffel.

Problema iškyla keliose paveldėjimo hierarchijose, kai dvi ar daugiau tėvų klasės, naudojamos antrinei klasei sukurti, iš pradžių yra išvestos tik iš vienos ar tos pačios senelių klasės. Tai vadinama deimantų problema, pavadinimas kilęs iš to, kaip hierarchija atrodytų šioje situacijoje. Kai kompiliatoriaus programa bando sukurti klasę, pavyzdžiui, anūkų klasę, sudarytą iš dviejų tėvų klasių su bendru seneliu, atmintyje padaromos dvi senelio kopijos, po vieną kiekvienam iš tėvų.

Dėl neaiškumo, kurį sukelia kelios to paties senelio kopijos atmintyje, kompiliatorius negali nustatyti, kurią senelio kopiją anūkas turėtų naudoti senelių duomenims ar funkcijoms pasiekti. Siekiant ištaisyti šią situaciją, C++ kalboje senelis paverčiamas virtualia klase, kai deklaruojami tėvai. Dėl to kompiliatorius atmintyje padaro tik vieną senelio kopiją, kuria dalijasi abu tėvai. Kai senelis tampa virtualia klase, kompiliatorius neturi problemų nuspręsti, kaip anūkas turėtų pasiekti senelį, nes yra tik viena senelio kopija.

Reikėtų būti labai atsargiems struktūrizuojant klasių hierarchijas, ypač kai jos bus įtrauktos į daug didesnes hierarchijas arba taps jos pagrindu. Tinkamas virtualios klasės panaudojimas suteikia klasių hierarchijoms daugiau laisvės plėtojant; tačiau jie gali sukelti klaidų, kurias sunku rasti. Tvirtų kompiuterių programavimo inžinerijos principų studijavimas padės užtikrinti, kad neatsirastų netikėtų šalutinių poveikių dėl netinkamo programos organizavimo.