Множественное наследование_C++-касты и RTTI (1115007), страница 2
Текст из файла (страница 2)
type_info и typeid2. dynamic_casttype_info∙ Класс объявленный в <typeinfo>.∙ Методы: ==, !=, name, before (т.е. не копируется).∙ Можно получить type_info при помощи оператораtypeid.∙ typeid от нулевого указателя бросает bad_typeid.http://compscicenter.ru19/22Множественное наследование, C++-касты и RTTIИспользование type_infostruct A {virtual ~ A () { }};struct B : A { };int main () {B b;A * ap = & b ;A & ar = b ;cout << typeid (* ap ). name () << endl ; // Bcout << typeid ( ar ) . name () << endl ; // Bcout << typeid ( ap ) . name () << endl ; // A *cout << typeid ( A *). name () << endl ; // A *cout << ( typeid ( ar ) == typeid ( B )) << endl ; // 1}http://compscicenter.ru20/22Множественное наследование, C++-касты и RTTIПреобразования в C++: dynamic_castПозволяет делать преобразования с проверкой типа временивыполнения.A * a = ( rand () % 2) ? new B () : new C ();if ( B * b = dynamic_cast < B * >( a ))...else if ( C * c = dynamic_cast < C * >( a ))...Особенности:∙ Не заменяется преобразованием в стиле C.∙ Требует наличие виртуальных функций (полиморфность).∙ При приведении к ссылке кидает исключение bad_cast.∙ При приведении к указателю может вернуть 0.Что возвращает dynamic_cast<void *>(a)?Почему следует избегать RTTI?http://compscicenter.ru21/22Множественное наследование, C++-касты и RTTIПример: double dispatchstruct Triangle ; struct Rectangle ; struct Circle ;struct Shape {virtual ~ Shape () {}virtual bool intersect ( Rectangle * r ) = 0;virtual bool intersect ( Triangle* t ) = 0;virtual bool intersect ( Circle* c ) = 0;virtual bool intersect ( Shape* s ) = 0;};struct Triangle : Shape {bool intersect ( Rectangle * r ) { ...
}bool intersect ( Triangle* t ) { ... }bool intersect ( Circle* c ) { ... }bool intersect ( Shape* s ) {return s - > intersect ( this );}};bool intersect ( Shape * a , Shape * b ) { return a - > intersect ( b ); }http://compscicenter.ru22/22.