Vad är en virtuell klass?

En virtuell klass är en klass som tilldelas endast en gång i minnet, så att barn i den klassen endast använder den ena kopian av den förälderklassen som är etablerad i minnet. En klass är en grupp objekt som delar gemensamma drag eller attribut. Att göra en klass virtuell ger objektorienterade programmeringsspråk möjligheten att använda multipelt arv när andra eller fler generationens överordnade klasser härrör från vanliga förfäders basklasser. Beroende på vilket datorprogrammeringsspråk som refereras 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 anses vara virtuell.

Inte alla objektorienterade programmeringsspråk tillåter multipel nedärvning, vilket är när en underordnad klass kan härledas från flera överordnade klasser samtidigt. I ett programmeringsspråk som C++ kan en klass ärva alla medlemsdata och medlemsfunktioner från båda överordnade klasserna samtidigt och ha tillgång till båda uppsättningarna av överordnade data och funktioner. Andra språk som stöder multipla arv inkluderar Perl, Python, Tcl och Eiffel.

Ett problem uppstår i flera arvshierarkier när två eller flera föräldraklasser som används för att skapa en barnklass ursprungligen härleds från endast en eller samma farförälderklass. Detta kallas diamantproblemet, namnet som härrör från hur hierarkin skulle se ut i denna situation. När ett kompileringsprogram försöker instansiera en klass, till exempel en barnbarnsklass gjord av två föräldraklasser med en gemensam morförälder, görs två kopior av morföräldern i minnet, en 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 som barnbarnet ska använda för att komma åt farförälderdata eller funktioner. För att råda bot på denna situation, i C++ görs farföräldern till en virtuell klass när föräldrarna förklaras. Detta gör att kompilatorn bara gör en kopia av farföräldern i minnet som båda föräldrarna delar. När morföräldern väl har blivit en virtuell klass har kompilatorn inga problem att bestämma hur barnbarnet ska komma åt morföräldern eftersom det bara finns en kopia av morföräldern.

Stor försiktighet bör iakttas när man strukturerar klasshierarkier, särskilt när de kommer att ingå i eller bli basen för mycket större hierarkier i framtiden. Rätt utnyttjande av en virtuell klass ger klasshierarkier större utrymme för utveckling; de har dock potential att orsaka fel som är svåra att lokalisera. Studiet av solida principer för datorprogrammering kommer att bidra till att säkerställa att oväntade biverkningar från felaktig programorganisation inte uppstår.