Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_k_ekzamenu_po_C.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
242 Кб
Скачать
☆

24. Повышающее преобразование. Понижающее пре­образование

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

(downcast), так как графически в иерархии наследования принято изображать производные классы ниже базовых. Приведение из производного класса в базовый называют повышающим (upcast), а приведение между производными классами одного базового или, наоборот, между базовыми классами одного производного — перекрестным (crosscast).

Выполнение с помощью операции dynamic_cast повышающего преобразования равносильно простому присваиванию:

class В{ / * ... * / };

class С: public В{ /* ... */ };

С* с = new С:

В* b = clynamic__cast<B*>(c): // Эквивалентно В* b = с;

Чаще всего операция dynamic_cast применяется при понижающем преобразовании — когда компилятор не имеет возможности проверить правильность приведения.

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

Для полиморфного объекта реализация операции clynam1c_cast весьма эффективна, поскольку ссылка на информацию о типе объекта заносится в таблицу виртуальных методов, и доступ к ней осуществляется легко. С точки зрения логики требование, чтобы объект был полиморфным, также оправдано: ведь если класс не имеет виртуальных методов, его нельзя безопасным образом использовать, не зная точный тип указателя. А если тип известен, использовать операцию dynamic_cast нет необходимости.

25. Преобразование ссылок. Перекрест­ное преобразование

Для аргумента-ссылки смысл операции преобразования несколько иной, чем для указателя. Поскольку ссылка всегда указывает на конкретный объект, операция dynamic_cast должна выполнять преобразование именно к типу этого объекта. Корректность приведения проверяется автоматически, в случае несовпадения порождается исключение bad_cast.

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

26. Преобразование типа на стадии компиляции. Операция static_cast. Операция reinterpret_cast

Операция static__cast используется для преобразования типа на этапе компиляции

между:

  • целыми типами;

  • целыми и вещественными типами;

  • целыми и перечисляемыми типами;

  • указателями и ссылками на объекты одной иерархии, при условии, что оно однозначно и не связано с понижающим преобразованием виртуального базового класса.

Формат операции: static_cast <тип> (выражение)

Результат операции имеет указанный тип, который может быть ссылкой, указателем, арифметическим или перечисляемым типом.

float f = 100:

int 1 = static_cast <1nt> (f):

// Целые и вещественные имеют различное внутреннее представление

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

Формат операции: reinterpret_cast <тип> (выражение)

Результат операции имеет указанный тип, который может быть ссылкой, указателем, целым или вещественным типом.

Пример:

char *р = reinterpret_cast <char*>(malloc(100)):

long 1 = reinterpret_cast <long>(p);