Не стал открывать новую тему. Но данный вопрос очень важен для программистов в связи с подходящими сроками сдачи курсовой по Криптографии. Тем кто пишет в стиле party hard и ООП во все поля, читать в первую очередь.
Динамическая идентификация типов
Динамическая идентификация необходима для однозначной идентификации типа данных. Чаще всего возникает необходимость в этом когда на этапе выполнения программы тип данных не известен. Характерно для языков поддерживающих полиморфизм. Например C++ или Delphi.
Информацию об объекте получают с помощью оператора typeid(описан в <typeinfo>). Синтаксис: typeid(объект). Здесь объект - это тот объект информацию о типе которого нужно получить. Оператор typeid() возвращает ссылку на на объект типа type_info, который и будет описывать тип объекта объект. Хочу заметить, что typeid может идентифицировать любые типы и объекты.
Пример использования.
Например есть два класса рожденных от BaseClass который имеет virtual void f() - делает BaseClass полиморфным.
Derived1: public BaseClass и Derived2: public BaseClass.
int i; Derived1 ob1; Derived2 ob2; BaseClass *p, baseob;
Вывод на экран встроенного типа данных.
cout << "Тип переменной i - это" << typeid(i).name() <<endl;
Обработка полиморфных объектов.
p = &baseob;
cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;
p = &ob1;
cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;
p = &ob2;
cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;
В результате на экране увидим.
Тип переменной i - это int
Указатель p указывает на объект типа BaseClass
Указатель p указывает на объект типа Derived1
Указатель p указывает на объект типа Derived2
В том числе возможно использование typeid и в перегруженных конструкциях. Метод работы не отличается.
Динамическое приведение типов данных.
Кроме стандартного приведения типов возможны приведения типов объектов. Далее рассмотрим работу dynamic_cast. Для начала рассмотрим его, т.к. он имеет прямое отношение к динамической идентификации типов.
Оператор dynamic_cast реализует приведение типов в динамическом режиме, что позволяет контролировать правильность приведения типа в "реалтайме". Если приведение типов не произойдет при помощи dynamic_cast то возникнет исключительная ситуация(или просто ошибка приведения)
Основная форма каста: dynamic_cast<целевой тип>(выражение). Рассмотрим простой пример.
Предположим, что Base - это базовый класс, а Derived - это класс, производный от Base.
Base *bp, b_ob;
Derived *dp, d_ob;
bp = &d_ob; //Указатель базового класса указывает на объект производного класса.
dp = dynamic_cast<Derived *>(bp)
if(!dp) cout "Приведение прошло успешно";
Здесь приведение типа указателя bp базового класса к типу указателя dp производного класса прошло успешно, поскольку указатель bp на самом деле указывает на объект производного класса Derived. Однако в следующем примере произойдет ошибка, поскольку указатель bp указывает на объект базового класса Base, а приводить тип объекта базового класса к типу объекта произвольного класса - неправильно.
bp = &b_ob;
dp = dynamic_cast<Derived *>(bp);
if(!dp) cout "Приведения типов не произошло";
В некоторых случаях dynamic_cast можно использовать вместо typeid. Об этом и статических кастах поговорим чуть позже. А пока я буду наслаждаться ароматным зеленым чаем.