С динамической идентификацией типов вы, возможно, незнакомы, поскольку это средство отсутствует в таких неполиморфных языках, как С. В неполиморфных языках попросту нет необходимости в получении информации о типе во время выполнения программы, так как тип каждого объекта известен во время компиляции (т.е. еще при написании программы). Но в таких полиморфных языках, как C++, возможны ситуации, в которых тип объекта неизвестен в период компиляции, поскольку точная природа этого объекта не будет определена до тех пор, пока программа на начнет выполняться. Как вы знаете, C++ реализует полиморфизм посредством использования иерархии классов, виртуальных функций и указателей на базовые классы. Указатель на базовый класс можно использовать для ссылки на члены как этого базового класса, так и на члены любого объекта, выведенного из него. Следовательно, не всегда заранее известно, на объект какого типа будет ссылаться указатель на базовый класс в произвольный момент времени. Это выяснится только при выполнении программы — при использовании одного из средств динамической идентификации типов.
Чтобы получить тип объекта во время выполнения программы, используйте оператор
typeid(object)
Здесь элемент
В классе
bool operator = (const type_info &ob);
bool operator !=(const type_info &ob);
bool before(const type_info &ob);
const char *name();
Перегруженные операторы
Рассмотрим простой пример использования оператора
// Пример использования оператора typeid.
#include
#include
using namespace std;
class myclass {
// . . .
};
int main()
{
int i, j;
float f;
myclass ob;
cout << "Тип переменной i: " << typeid(i).name();
cout << endl;
cout << "Тип переменной f: " << typeid(f).name();
cout << endl;
cout << "Тип переменной ob: " << typeid(ob).name();
cout << "\n\n";
if(typeid(i) == typeid(j))
cout << "Типы переменных i и j одинаковы.\n";
if(typeid(i) != typeid(f))
cout << "Типы переменных i и f неодинаковы.\n";
return 0;
}
При выполнении этой программы получены такие результаты.
Тип переменной i: int
Тип переменной f: float
Тип переменной ob: class myclass
Типы переменных i и j одинаковы.
Типы переменных i и f неодинаковы.
Если оператор
Следовательно, оператор
/* Пример применения оператора typeid к иерархии полиморфных классов.
*/
#include
#include
using namespace std;
class Base {
virtual void f() {}; // делаем класс Base полиморфным
// . . .
};
class Derived1: public Base {
// . . .
};
class Derived2: public Base {
// ...
};
int main()
{