    Если по некоторым причинам typeid не может создать объект класса Type_info 
(например, при разыменовывании нулевого указателя), оператор возбуждает 
исключительную ситуацию типа Bad_typeid. Следовательно при использовании 
typeid необходимо запрограммировать оператор catch, обрабатывающий эту ошибку. 

    ЗАМЕЧАНИЕ 

    Вопреки вышесказанному в справочным руководствам Borland, проверка 
показывает, что оператор typeid не возбуждает исключительную ситуацию для 
разыменонанного нулевого указателя. Скорее всего, причина этому - ошибка
в компиляторе.

    В листинге 15.20 демонстрируется использование оператора typeid. Вы можете 
скомпилировать и запустить эту программу как DOS- или Easy Win-приложение. 
(Не обращайте внимания на предупреждения комлялятора о том, что объявленные 
переменные не используются.) 

    Листинг 15.20.  TYPEINFO.CPP (демонстрация оператора typeid) 

    1:	#include <iostream.h> 
    2:	#include <string.h> 
    3:	#include <typeinfo. h> 
    4:		
    5:	class AnyClass { 
    6:	public: 
    7:	   AnyClass(int c) { count = c; } 
    8:	private: 
    9:	   int count; 
    10:	}; 
    11: 
    12:	#pragma warn -use 
    13: 
    14:	int main() 
    15:	{ 
    16:	   char c; 
    17:	   int i; 
    18:	   double d; 
    19:	   AnyClass a(1); 
    20:	   AnyClass *pa = new AnyClass(2); 
    21: 
    22:	   cout « "Name  " « typeid(c).name() « endl; 
    23:	   cout « "Name  " « typeid(i).nameO « endl; 
    24:	   cout « "Name   « typeid(d).name() « endl; 
    25:	   cout « "Наве  " « typeid(a).name() « endl; 
    26:	   cout « "Name  " « typeid (pa).name() « endl; 
    27:	   cout « "Name  " « typeid (* pa).name () « endl; 
    28:	   cout « "Name  " « typeid(typeid( i ) ).nane()« endl; 
    29: 
    30:	   cout « endl; // Начать с новой строки 
    31: 
    32:	// Следующие строки не выводят корректные имена типов, 
    33:	// это следствие ошибки в ВС++ 4. 
    34:	/* 
    35:	   if (typeid(c) != typeid(d)) 
    36:	      cout « typeid(c).name() « "	and " 
    37:	      « typeid(d).name() « "are not equivalent." « endl; 
    38:	*/ 
    39: 
    40:	// Очевидно, необходимо использовать name() только один раз в
    41:	// операторе вывода в поток. Следующие строки работают правильно.    
    42: 
    43:	if (typeid(c) != typeid(d)) {
    44:           cout « typeid(c).nante() « " and cout « typeid(d).name() « " are not equivalent." « endl; 
    45:        }
    46:
    47:
    48:       // Сравнить обычный и динамический объекты одного и того же типа 
    49:      if ( typeid( a ) == typeid( *pa ) ) 
    50:         cout « "a and »pa are objects of the same types" « endl; 
    51:
    52:     // Демонстрация обработки исклвчитепьной ситуации Bad_typeid 
    53     try { 
    54:       cout « endl; 
    55:       cout « "Using a dereferenced null pointer typeid" « endl; 
    56:       int *p; // Define a pointer 
    57:       p =0;  // Assign null to the pointer 
 

    420     Часть III. Программирование на ANSI С++
