|
Выражение должно быть указателем или ссылкой на класс, тип – базовым или производным для этого класса. После проверки допустимости преобразования, если все правильно, то результатом операции будет заданный тип, а в противном случае, для указателя – нуль, для ссылки генерируется исключение 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) (лучше почитать после обсуждения виртуальных функций). |