Rzutowanie

Język C++ zapewnia, że jeśli klasa dziedziczy po klasie bazowej, zawierającej funkcje wirtualne, wskaźnik do tej klasy bazowej może służyć do implementacji funkcji wirtualnych znajdujących się w obiekcie klasie pochodnej. Klasa zawierająca funkcje wirtualne jest czasami nazywana „klasą polimorficzną”.

Ponieważ klasa pochodna zawiera definicje wszystkich klas bazowych, po których dziedziczy, bezpieczne jest rzutowanie wskaźnika w górę hierarchii na jedną z tych klas bazowych. Podając wskaźnik do klasy bazowej, rzutowanie wskaźnika w dół hierarchii może być bezpieczne. Jest to bezpieczne, jeśli wskazywany obiekt jest rzeczywiście typu dziedziczonego z klasy bazowej. W tym przypadku rzeczywisty obiekt mówi się, że jest "kompletnym obiektem". Wskaźnik do klasy bazowej mówi się, że wskazuje "podobiekt" kompletnego obiektu. Na przykład, rozważmy hierarchię klas pokazaną na poniższym rysunku.

Diagram of a class hierarchy where C derives from B, which derives from A.
Hierarchia klas

Obiekt typu C może zostać zwizualizowany jak pokazano na poniższym rysunku.

Diagram of Class C with subobjects B and A.
Klasa C z obiektami podrzędnymi B i A

Biorąc pod uwagę wystąpienie klasy C, istnieje podobiekt B i podobiekt A. Wystąpienie klasy C, oraz podobiekty A i B to „obiekt kompletny”.

Korzystając z informacji o typie uzyskiwanej w czasie wykonywania, możliwe jest sprawdzenie, czy wskaźnik faktycznie wskazuje na obiekt kompletny i może być bezpiecznie rzutowany na wskaźnik na inny obiekt w jego hierarchii. Operator dynamic_cast może służyć do tworzenia tego typu rzutów. Wykonuje także niezbędne sprawdzenie w czasie wykonania w celu bezpiecznego wykonania operacji.

W przypadku konwersji typów niepolymorficznych można użyć operatora static_cast (w tym temacie opisano różnicę między konwersjami rzutowania statycznego i dynamicznego oraz gdy jest to odpowiednie do użycia).

W tej sekcji omówiono następujące tematy:

Zobacz też

Wyrażenia