Co to jest klasa wirtualna?
Klasa wirtualna to klasa przydzielana 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 o wspólnych cechach lub atrybutach. Uczynienie klasy wirtualną daje zorientowanym obiektowo językom programowania możliwość korzystania z wielokrotnego dziedziczenia, gdy klasy rodzicielskie drugiej lub więcej generacji pochodzą ze wspólnych przodkowych klas podstawowych. W zależności od języka programowania, do którego się odwołuje, słowo kluczowe „wirtualne”, podobne słowo kluczowe lub składnia i semantyka klasy są używane do sugerowania, że daną klasę należy uznać za wirtualną.
Nie wszystkie zorientowane obiektowo języki programowania pozwalają na wielokrotne dziedziczenie, czyli wtedy, gdy klasa potomna może być wyprowadzona z wielu klas rodzicielskich jednocześnie. 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 nadrzędnych i funkcji. Inne języki, które obsługują wielokrotne dziedziczenie, to Perl, Python, Tcl i Eiffel.
Problem występuje w wielu hierarchiach dziedziczenia, gdy dwie lub więcej klas nadrzędnych użytych do utworzenia klasy podrzędnej pochodzi z jednej lub tej samej klasy dziadków. Nazywa się to problemem diamentowym, nazwa wywodząca się z wyglądu hierarchii w tej sytuacji. Kiedy program kompilatora próbuje utworzyć instancję klasy, takiej jak klasa wnuczka utworzona z dwóch klas rodzicielskich ze wspólnym dziadkiem, w pamięci są tworzone dwie kopie dziadka, po jednej dla każdego rodzica.
Ze względu na dwuznaczność 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 dziadka. Aby zaradzić tej sytuacji, w C ++ dziadek staje się klasą wirtualną, kiedy deklaruje się rodziców. To powoduje, że kompilator tworzy tylko jedną kopię dziadka w pamięci, którą dzielą oboje rodzice. Gdy dziadek stał się klasą wirtualną, kompilator nie ma problemu z decyzją, w jaki sposób wnuk powinien uzyskać dostęp do dziadka, ponieważ istnieje tylko jedna kopia dziadka.
Podczas tworzenia hierarchii klas należy zachować szczególną ostrożność, 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 hierarchii klas większą swobodę w rozwoju; mogą jednak powodować błędy, które trudno zlokalizować. Badanie solidnych zasad inżynierii programistycznej pomoże zapewnić, że nie wystąpią nieoczekiwane skutki uboczne niewłaściwej organizacji programu.