Klasa wirtualna to klasa, która jest alokowana tylko raz w pamięci, tak że dzieci tej klasy używają tylko jednej kopii tej klasy nadrzędnej, która jest ustanowiona w pamięci. Klasa to grupa obiektów, które mają wspólne cechy lub atrybuty. Utworzenie klasy wirtualnej daje językom programowania zorientowanym obiektowo możliwość korzystania z wielokrotnego dziedziczenia, gdy klasy nadrzędne drugiej lub więcej generacji pochodzą ze wspólnych klas bazowych przodków. W zależności od języka programowania, do którego się odwołujemy, słowo kluczowe „wirtualne”, podobne słowo kluczowe lub składnia i semantyka klasy są używane do zasugerowania, że konkretna klasa ma być uważana za wirtualną.
Nie wszystkie języki programowania zorientowane obiektowo umożliwiają wielokrotne dziedziczenie, co oznacza, że klasa potomna może być wyprowadzona z wielu klas nadrzędnych w tym samym czasie. W języku programowania, takim jak C++, klasa może dziedziczyć wszystkie dane składowe i funkcje składowe z obu klas nadrzędnych jednocześnie i mieć dostęp do obu zestawów danych i funkcji nadrzędnych. Inne języki obsługujące dziedziczenie wielokrotne to Perl, Python, Tcl i Eiffel.
Problem pojawia się w wielu hierarchiach dziedziczenia, gdy dwie lub więcej klas nadrzędnych użytych do utworzenia klasy podrzędnej pochodzi od tylko jednej lub tej samej klasy dziadków. Nazywa się to problemem diamentowym, nazwa wywodząca się od tego, jak hierarchia wyglądałaby w tej sytuacji. Kiedy program kompilatora próbuje utworzyć instancję klasy, na przykład klasy wnuka utworzonej z dwóch klas nadrzędnych ze wspólnym dziadkiem, w pamięci tworzone są dwie kopie dziadka, po jednej dla każdego rodzica.
Ze względu na niejednoznaczność spowodowaną wieloma kopiami tego samego dziadka w pamięci kompilator nie jest w stanie ustalić, której kopii dziadka powinien użyć wnuk, aby uzyskać dostęp do danych lub funkcji dziadków. Aby temu zaradzić, w C++ dziadek staje się wirtualną klasą podczas deklarowania rodziców. Powoduje to, że kompilator tworzy tylko jedną kopię dziadka w pamięci, którą dzielą oboje rodzice. Gdy dziadek stanie się klasą wirtualną, kompilator nie ma problemu z podjęciem decyzji, w jaki sposób wnuk powinien uzyskać dostęp do dziadka, ponieważ istnieje tylko jedna kopia dziadka.
Należy zachować szczególną ostrożność przy konstruowaniu hierarchii klas, zwłaszcza gdy zostaną one włączone lub staną się podstawą dla znacznie większych hierarchii w przyszłości. Właściwe wykorzystanie klasy wirtualnej daje hierarchiom klas większą swobodę w rozwoju; jednak mogą powodować błędy, które są trudne do zlokalizowania. Badanie solidnych zasad inżynierii programowania komputerowego pomoże zapewnić, że nie wystąpią nieoczekiwane skutki uboczne niewłaściwej organizacji programu.