Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Dynamic_cast <тип *> (выражение).

Наследование классов | Применение наследования | Конструкторы, деструктор и перегрузка опрации присваивания в производном классе. | Виртуальные функции | Плата за полиморфизм | Абстрактные базовые классы и чисто виртуальные функции | Множественное наследование |


Выражение должно быть указателем или ссылкой на класс, тип – базовым или производным для этого класса. После проверки допустимости преобразования, если все правильно, то результатом операции будет заданный тип, а в противном случае, для указателя – нуль, для ссылки генерируется исключение bad_cast. Если заданный тип и тип выражения – из разных иерархий, преобразование не допустимо. Операция dynamic_cast может использоваться для повышающих, понижающих и перекрестных (cross-cast) преобразований. Повышающее преобразование равносильно простому присваиванию, например:

class B{…};

class C: public B{…};

C* c=new C;

B* b=dynamic_cast<B*>(c);

Операция dynamic_cast в качестве понижающего преобразования часто применяется, когда у компилятора нет возможности проверить правильность приведения типа. Для того, чтобы проверка на допустимость преобразования в таких случаях оказалась возможной, аргумент операции dynamic_cast должен иметь, так называемый, полиморфный тип, т.е., иметь членом хотя бы одну виртуальную функцию. Но об этом мы поговорим после обсуждения механизма виртуальных функций (если успеем…).

Об операции static_cast мы говорили в Лекц. No 4, но не в применении к классам.

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

Синтаксис(результат – указанный тип):

static_cast < тип > (выражение)

Например,

float f=10;

int k=static_cast <int> (f); // если оставить int k=f, компилятор заметит и //предупредит о возможной потере данных.

При выполнении подобных операций возможно изменение внутреннего представления данных, хотя численное значение остается неизменным.

Операция static_cast допускает выполнение преобразования из производного класса в базовый и наоборот без ограничений. Но программист должен сам отслеживать допустимость дальнейших действий с преобразованными величинами. Пример:

class B{…};

class C: public B{…};

C c;

B *bp = static_cast <B*> (c); //производный в базовый

B b;

C& cp = static_cast <C&> (b); //базовый в производный.

В общем случае при преобразовании указателей на родственные классы иерархии рекомендуется использовать dynamic_cast. При этом, если преобразование возможно на этапе компиляции, то сгенерированный код будет тот же, что и для static_cast.

В связи с нашим обсуждением преобразования типов, следует упомянуть о механизме идентификации типов во время выполнения программы (подробнее см. Павловская, стр.237 или, лучше, В. Подбельский, стр.481).

 


Дата добавления: 2015-11-16; просмотров: 88 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Использование объектов производного класса в качестве объектов базового класса| Информация о типе во время выполнения (RTTI) (лучше почитать после обсуждения виртуальных функций).

mybiblioteka.su - 2015-2024 год. (0.006 сек.)