Operatory RTTI
Informacja o typie podczas wykonania (ang. RunTime Type Information - RTTI) jest pewnym dodatkowym mechanizmem, umożliwiającym korzystanie z dynamicznego systemu typów. Należą do nich operator pobrania informacji o typie `typeid' oraz operator rzutowania `dynamic_cast'. Jednak operatory RTTI mają różne znaczenie w zależności od tego, czy używa się ich do typów zwykłych, czy polimorficznych. Ponieważ polimorfizmem zajmiemy się dużo później, omówię tylko znaczenie operatora typeid dla typów zwykłych (właściwie dla typów zwykłych nie ma specjalnego znaczenia, poza "uogólnieniem"; jego wywołanie dla typów niepolimorficznych jest operacją bezstanową). Nie zostanie również omówiony operator dynamic_cast, ponieważ ten operator jest przeznaczony wyłącznie dla typów polimorficznych.
Korzystanie z operatora typeid wymaga przede wszystkim wczytania nagłówka <typeinfo>. Deklaruje on strukturę type_info, w której mamy dostępne:
- metodę name(), która zwraca napis określający nazwę typu (jako const char*)
- operator ==, który pozwala stwierdzić tożsamość obiektów type_info
- metodę before(), która pozwala na porządkowanie obiektów type_info (ale nie ma żadnego sensownego związku z hierarchią klas i jest czymś takim jak różnica adresów).
Operator typeid przyjmuje taki sam argument jak sizeof, tzn. albo wyrażenie albo typ; zwraca obiekt type_info, odpowiadający danemu typowi. Dodam jeszcze tylko tyle, że w typach polimorficznych będzie on miał znaczenie tylko w przypadku użycia go z konkretnym obiektem i pozwala właśnie na stwierdzenie RZECZYWISTEGO typu obiektu, a nie typu zdereferowanego wskaźnika.
Obecnie struktura type_info ma niewielkie zastosowanie, a nawet metoda name() nie posiada żadnych standardów co do tego, co ma ona zwracać (może nawet zwrócić pusty wskaźnik!). Ostatnie wersje GNU C++ (powyżej 2.7) dopiero zwracają przez to taką nazwę, jaka powstanie po zmanglowaniu (czyli `i' dla int, `PCc' dla const char*, `R6Klocek' dla Klocek& itd.), wcześniejsze z kolei dla typów ścisłych zwracały (const char*)0.
Operator typeid jest w C++ takim "wyjściem awaryjnym" i zazwyczaj istnieją lepsze metody, niż jego używanie. Sens jego używania dla typów nie będących polimorficznymi istnieje tylko w celu "uogólnienia" systemu obsługi typów na dynamiczny. Wymaga to oczywiście ręcznej implementacji.