Mis on virtuaalklass?

Virtuaalne klass on klass, mis eraldatakse mällu ainult üks kord, nii et selle klassi lapsed kasutavad ainult selle ülemklassi ühte koopiat, mis on mällu loodud. Klass on rühm objekte, millel on ühised tunnused või atribuudid. Klassi virtuaalseks muutmine annab objektorienteeritud programmeerimiskeeltele võimaluse kasutada mitut pärandit, kui teise või enama põlvkonna vanemklassid on tuletatud ühistest esivanemate baasklassidest. Olenevalt viidatud arvutiprogrammeerimiskeelest kasutatakse „virtuaalset” märksõna, sarnast märksõna või klassi süntaksit ja semantikat, mis viitavad sellele, et teatud klassi tuleb pidada virtuaalseks.

Mitte kõik objektorienteeritud programmeerimiskeeled ei võimalda mitut pärimist, mis tähendab, et alamklassi saab tuletada korraga mitmest ülemklassist. Programmeerimiskeeles, nagu C++, saab klass pärida kõik liikmeandmed ja liikmefunktsioonid mõlemalt vanemklassilt korraga ning omada juurdepääsu mõlemale lähteandmete ja funktsioonide komplektidele. Muud mitmekordset pärimist toetavad keeled on Perl, Python, Tcl ja Eiffel.

Probleem ilmneb mitmes pärimishierarhias, kui kaks või enam alamklassi loomiseks kasutatud vanemaklassi on algselt tuletatud ainult ühest või samast vanavanemaklassist. Seda nimetatakse teemandiprobleemiks, mille nimi tuleneb sellest, kuidas hierarhia selles olukorras välja näeks. Kui kompilaatoriprogramm proovib instantseerida klassi, näiteks lapselapse klassi, mis on tehtud kahest vanemaklassist ühise vanavanemaga, tehakse vanavanemast kaks koopiat mällu, üks kummagi vanema jaoks.

Ebaselguse tõttu, mida põhjustavad sama vanavanema mitmed koopiad mälus, ei suuda koostaja kindlaks teha, millist vanavanema koopiat peaks lapselaps kasutama vanavanema andmetele või funktsioonidele juurdepääsuks. Selle olukorra parandamiseks muudetakse C++ keeles vanavanemast vanemate deklareerimisel virtuaalne klass. Selle tulemusel teeb kompilaator vanavanemast ainult ühe koopia, mida mõlemad vanemad jagavad. Kui vanavanemast on saanud virtuaalne klass, pole koostajal probleeme otsustada, kuidas lapselaps vanavanemale ligi pääseb, sest vanavanemast on ainult üks eksemplar.

Klassihierarhiate struktureerimisel tuleks olla väga ettevaatlik, eriti kui need kaasatakse tulevikus palju suurematesse hierarhiatesse või muutuvad nende aluseks. Virtuaalse klassi õige kasutamine annab klassihierarhiatele suurema arenguruumi; kuid need võivad põhjustada vigu, mida on raske leida. Arvutiprogrammeerimise kindlate põhimõtete uurimine aitab tagada, et programmi ebaõigest korraldamisest tulenevaid ootamatuid kõrvalmõjusid ei tekiks.