ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4262
Скачиваний: 28
Глава 38. Динамическая идентификация типов <typeinfo>
421
Листинг 38.1. Динамическое определение типа объекта
#include <iostream>
#include <typeinfo>
using namespace std;
class Base
{
virtual f() {};
};
class Derived: public Base {};
int main()
{
Base *p = new Base;
Derived *q = new Derived;
cout << (typeid(*p) == typeid(*q)) << endl; // 0
cout << (typeid(*p) != typeid(*q)) << endl; // 1
cout << (typeid(*p).before(typeid(*q))) << endl; // 1
delete p;
p = q;
cout << typeid(*p).name() << endl; // class Derived
cout << typeid(*q).name() << endl; // class Derived
delete q;
return 0;
}
38.4. Обработка исключения
bad_typeid
Если операндом оператора
typeid
является пустой указатель, то
этот оператор выбрасывает исключение типа
bad_typeid
, который
имеет следующий интерфейс:
Часть IV. Стандартная библиотека языка программирования С++
422
namespace std
{
class bad_typeid : public exception
{
public:
bad_typeid() throw();
bad_typeid(const bad_typeid&) throw();
bad_typeid& operator=(const bad_typeid&) throw();
virtual ~bad_typeid() throw();
virtual const char* what() const throw();
};
}
Отсюда видно, что класс
bad_typeid
наследуется от класса
exception
. Метод
what
этого класса возвращает указатель на стро-
ку языка программирования C, содержание которой зависит от
реализации.
В листинге 38.2 приведен пример обработки исключения типа
bad_typeid
.
Листинг 38.2. Обработка исключения типа
bad_typeid
#include <iostream>
#include <typeinfo>
using namespace std;
class Demo
{
virtual ~Demo() {};
};
int main()
{
Demo* d = NULL;
try
{
typeid(*d);
}
Глава 38. Динамическая идентификация типов <typeinfo>
423
catch (bad_typeid& e)
{
cout << e.what() << endl;
}
return 0;
}
38.5. Обработка
исключения
bad_cast
Если операндом оператора
dynamic_cast
является пустой указа-
тель, то этот оператор выбрасывает исключение типа
bad_cast
,
который имеет следующий интерфейс:
namespace std
{
class bad_cast : public exception
{
public:
bad_cast() throw();
bad_cast(const bad_cast&) throw();
bad_cast& operator=(const bad_cast&) throw();
virtual ~bad_cast() throw();
virtual const char* what() const throw();
};
}
Отсюда видно, что класс
bad_cast
наследуется от класса
exception
. Метод
what
этого класса возвращает указатель на стро-
ку языка программирования C, содержание которой зависит от
реализации.
В листинге 38.3 приведен пример обработки исключения типа
bad_cast
.
Листинг 38.3. Обработка исключения типа
bad_cast
#include <typeinfo.h>
#include <iostream>
Часть IV. Стандартная библиотека языка программирования С++
424
using namespace std;
class Base
{
virtual f() {};
};
class Derived: public Base {};
void f(Base& b) { Derived& rd = dynamic_cast<Derived&>(b); }
int main()
{
Base b;
Derived d;
try
{
f(d);
cout << "f(d)" << endl; // f(d)
f(b);
cout << "f(b)" << endl;
}
catch (bad_cast& e)
{
cout << e.what() << endl; // Bad dynamic_cast
}
return 0;
}
Г Л А В А
39
Работа со строками
в С++ <string>
В заголовочном файле string определяются следующие шаблоны
классов и их специализации:
namespace std
{
template<class E> class char_traits;
template<> class char_traits<char>;
template<> class char_traits<wchar_t>;
template<class E, class T = char_traits<E>,
class A = allocator<E>> class basic_string;
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
}
Шаблон класса
char_traits
определяет характеристики объектов
класса
E
, который является параметром шаблона. При работе со
строками эти объекты обычно называются символами.
Для шаблона класса
char_traits
определены две явные специали-
зации
char_traits<char>
и
char_traits<wchar_t>
, которые опреде-
ляют характеристики типов
char
и
wchar_t
соответственно.
Шаблон класса
basic_string
определяет контейнер, элементами
которого являются объекты класса, задаваемого параметром
E
этого шаблона. Параметры
T
и
A
задают классы, которые опреде-
ляют соответственно характеристики и распределитель памяти
для объектов класса
E
.