Языки программирования - концепции и принципы

нию производного типа не допускается,


    Преобразование вниз (down-conversion) от значения базового типа к значе­ нию производного типа не допускается, поскольку мы не знаем, какие значе­ния включить в дополнительные поля. Рассмотрим, однако, указатель на ба­зовый тип:

Base_Class*                    Base_Ptr = new Base_Class;

C++

Derived_Class*               Derived_Ptr = new Derived_Class;

if (...) Base_Ptr = Derived_Ptr;

Derived_Ptr = Base_Ptr;                     // На какой тип указывает Base_Ptr?

Конечно, возможно, что Base_Ptr фактически укажет на объект производно­го типа; в этом случае нет никакой причины отклонить присваивание. С дру­гой стороны, если указуемый объект фактически имеет базовый тип, мы дела­ем попытку преобразования вниз, и присваивание должно быть отвергнуто. Чтобы предусмотреть этот случай, в языке C++ определено динамическое пре­образование типов (dynamic cast), которое является условным в зависимости от типа указуемого объекта:



C++

Derived_Ptr = dynamic_cast<Derived_Class*>Base_Ptr;

Если указуемый объект фактически имеет производный тип, преобразование завершается успешно. В противном случае указателю присваивается 0, и про­граммист может это проверить.

     Уже в языке Ada 83 допускалось явное преобразование между любыми дву­мя типами, порожденными друг из друга. Это не вызывало никаких проблем, потому что производные типы имеют в точности те же самые компоненты. Для них допустимо иметь различные представления (см. раздел 5.8), но пре­образование типов совершенно четко определено, потому что оба представле­ния имеют одинаковые число и типы компонентов.

     Расширение преобразования производного типа до теговых типов не вызывает проблем в случае преобразования вверх от производного типа к ба­зовому. Ненужные поля усекаются:

Ada

S:SST_Data;

A: Airplane_Data := Airplane_Data(S);

В другом направлении используются агрегаты расширения (extention aggregates), чтобы обеспечить значения для полей, которые были добавлены при расширении:


Содержание раздела