Vad är en virtuell klass?
En virtuell klass är en klass som endast tilldelas en gång i minnet, så att barn i den klassen bara använder en kopia av den förälderklassen som är etablerad i minnet. En klass är en grupp av objekt som delar vanliga egenskaper eller attribut. Att skapa en virtuell klass ger objektorienterade programmeringsspråk möjligheten att använda flera arv när andra eller flera generationers förälderklasser härrör från vanliga förfädernas basklasser. Beroende på datorprogrammeringsspråk som det hänvisas till används det "virtuella" nyckelordet, liknande nyckelord eller syntax och semantik för en klass för att antyda att en viss klass ska betraktas som virtuell.
Inte alla objektorienterade programmeringsspråk tillåter flera arv, vilket är när en barnklass kan härledas från flera överordnade klasser samtidigt. På ett programmeringsspråk som C ++ kan en klass ärva alla medlemsdata och medlemsfunktioner från båda föräldraklasserna på en gång och ha tillgång till båda uppsättningarna förälderdata och funktioner. Andra språk som stöder flera arv inkluderar Perl, Python, Tcl och Eiffel.
Ett problem uppstår i flera arvshierarkier när två eller flera förälderklasser som används för att skapa en barnklass ursprungligen härstammar från en eller samma morförälderklass. Detta kallas diamantproblemet, namnet härrör från hur hierarkin skulle se ut i denna situation. När ett sammanställningsprogram försöker instansera en klass, till exempel en barnbarnsklass gjord av två förälderklasser med ett gemensamt morförälder, görs två kopior av morföräldern i minnet, ett för varje förälder.
På grund av tvetydigheten som orsakas av flera kopior av samma morförälder i minnet kan kompilatorn inte fastställa vilken kopia av morföräldern barnbarnet ska använda för att få åtkomst till morföräldrarnas data eller funktioner. För att åtgärda denna situation görs morföräldrar till en virtuell klass när de förklarar föräldrarna. Detta gör att kompilatorn bara gör en kopia av morföräldern i minnet som båda föräldrarna delar. När morföräldern har blivit en virtuell klass har kompilatorn inga problem att bestämma hur barnbarnet ska få åtkomst till morföräldern eftersom det bara finns en kopia av morföräldern.
Stor omsorg bör vidtas vid strukturering av klasshierarkier, särskilt när de kommer att inkluderas i eller bli basen för mycket större hierarkier i framtiden. Ett korrekt utnyttjande av en virtuell klass ger klasshierarkier större utvecklingsgrad; de kan dock orsaka fel som är svåra att hitta. Undersökningen av solida principer för datorprogrammeringsteknik hjälper till att säkerställa att oväntade biverkningar från felaktig programorganisation inte uppstår.