O clasă virtuală este o clasă care este alocată o singură dată în memorie, astfel încât copiii din acea clasă să folosească doar o copie a acelei clase părinte care este stabilită în memorie. O clasă este un grup de obiecte care împărtășesc trăsături sau atribute comune. Realizarea unei clase virtuale oferă limbajelor de programare orientate pe obiecte capacitatea de a utiliza moștenirea multiplă atunci când clasele părinte din a doua generație sau mai multe sunt derivate din clasele de bază ancestrale comune. În funcție de limbajul de programare la care se face referire, cuvântul cheie „virtual”, cuvântul cheie similar sau sintaxa și semantica unei clase sunt folosite pentru a sugera că o anumită clasă trebuie considerată virtuală.
Nu toate limbajele de programare orientate pe obiecte permit moștenirea multiplă, adică atunci când o clasă copil poate fi derivată din mai multe clase părinte în același timp. Într-un limbaj de programare precum C++, o clasă poate moșteni toate datele și funcțiile membre de la ambele clase părinte simultan și poate avea acces la ambele seturi de date și funcții părinte. Alte limbi care acceptă moștenirea multiplă includ Perl, Python, Tcl și Eiffel.
O problemă apare în mai multe ierarhii de moștenire atunci când două sau mai multe clase părinți utilizate pentru a crea o clasă copil sunt derivate inițial din doar una sau aceeași clasă bunici. Aceasta se numește problema diamantului, numele care provine de la modul în care ar arăta ierarhia în această situație. Când un program de compilare încearcă să instanțieze o clasă, cum ar fi o clasă nepoțel făcută din două clase părinte cu un bunic comun, două copii ale bunicului sunt făcute în memorie, câte una pentru fiecare părinte.
Din cauza ambiguității cauzate de mai multe copii ale aceluiași bunic în memorie, compilatorul nu poate stabili ce copie a bunicului ar trebui să folosească nepotul pentru a accesa datele sau funcțiile bunicului. Pentru a remedia această situație, în C++ bunicul este transformat într-o clasă virtuală la declararea părinților. Acest lucru face ca compilatorul să facă o singură copie a bunicului în memorie pe care ambii părinți o partajează. Odată ce bunicul a devenit o clasă virtuală, compilatorul nu are nicio problemă să decidă cum ar trebui să acceseze nepotul la bunicul, deoarece există o singură copie a bunicului.
Ar trebui să se acorde mare atenție la structurarea ierarhiilor de clasă, mai ales atunci când acestea vor fi incluse sau vor deveni baza pentru ierarhii mult mai mari în viitor. Utilizarea corectă a unei clase virtuale oferă ierarhiilor de clasă o mai mare libertate de dezvoltare; cu toate acestea, ele au potențialul de a provoca erori greu de localizat. Studiul principiilor solide de inginerie de programare a computerelor va ajuta la asigurarea faptului că nu apar efecte secundare neașteptate de la organizarea necorespunzătoare a programului.