Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
распечатать.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
160.66 Кб
Скачать

30. Идентификация типа во время исполнения. Примеры.

В C++ для динамической идентификации типов[1] применяются операторы dynamic_cast и typeid (определён в файле typeinfo.h), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.

  • Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.

  • Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.

  • Если целевым типом является void*, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.

Оператор typeid[2] возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе.

31. Новые операторы приведения типов. Примеры.

Язык C++ поддерживает дополнительные операторы приведения типа: const_cast, dynamic_cast, reinterpret_cast и static_cast. Их общие формы записи выглядят следующим образом.

const_cast<тип> (объект)

dynamic_cast<тип> (объект)

reinterpret_cast<тип> (объект)

static_cast<тип> (объект)

здесь элемент тип задает новый тип, а элемент объект — объект, который должен приобрести новый тип.

Оператор const_cast используется для явного переопределения модификаторов const и/или volatile. Новый тип должен совпадать с исходным типом, за исключением изменения его атрибутов const или volatile. Чаще всего оператор const_cast используется для удаления атрибута const.

Оператор dynamic_cast проверяет законность выполнения заданной операции приведения типа. Если такую операцию выполнить нельзя, то выражение устанавливается равным нулю. Этот оператор в основном используется для полиморфных типов. Например, если даны два полиморфных класса, В и D, причем класс D выведен из класса В, то оператор dynamic_cast всегда может преобразовать указатель D* в указатель В*. Оператор dynamic_cast может преобразовать указатель В* в указатель D* только в том случае, если адресуемым объектом является объект D. И вообще, оператор dynamic_cast будет успешно выполнен только при условии, что разрешено полиморфное приведение типов(т.е. если новый тип можно законно применять к типу объекта, который подвергается этой операции). Если операцию приведения типа выполнить нельзя, результат действия оператора dynamic_cast оценивается как нулевой.

Оператор static_cast выполняет неполиморфное приведение типов. Например, его можно использовать для приведения указателя на базовый класс к типу указателя на производный класс. Его можно также использовать для любого стандартного преобразования. При этом никакие проверки во время работы программы не выполняются.

Оператор reinterpret_cast переводит один тип в совершенно другой. Например, его можно использовать для перевода указателя в целый тип. Оператор reinterpret_cast следует использовать для перевода типов указателей, которые несовместимы по своей природе.

Однако следует помнить, что только оператор const_cast может освободить от "обета постоянства", т.е. ни один из остальных операторов этой группы(dynamic_cast, static_cast, reinterpret_cast) не может "снять" с объекта атрибут const.