Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.PDF
Скачиваний:
208
Добавлен:
01.05.2014
Размер:
3.64 Mб
Скачать

converted to PDF by BoJIoc

}

Заметьте, что метод next не описан как виртуальный: нельзя изменить тип возвращаемого значения виртуальной функции. Важно помнить, что в языке C++ это приведение типа будет законным только для указателей, а не для собственно объектов (см. упражнение 2 этой главы). Функция dynamic_cast является частью системы RTTI (Run-Time Typing Information — идентификация типа во время выполнения), которая была описана в

главе 10. Приведение типов через RTTI должно использоваться вместо более ранних синтаксических форм, поскольку неправильное приведение типов данных является стандартным источником ошибок в программах.

В языке Object Pascal задействована аналогичная идея. Поскольку объекты рассматриваются внутренним образом как указатели, то это преобразование может применяться к объектам любого типа, а не только к указателям. Язык Object Pascal обеспечивает проверку класса объекта во время выполнения, так что все «сомнительные» приведения типа должны быть выявлены с помощью явной проверки до присваивания.

var

x : TextWindow; y : Window;

begin

...

if Member(y, TextWindow) then x := TextWindow(y)

else writeln('illegal window assignment');

...

end;

В языке Java переменная, которая содержит значение, принадлежащее подклассу приписанного ей класса, может быть приведена к типу подкласса. Однако такие преобразования проверяются во время выполнения программы, и если результат неправилен, то возбуждается исключительная ситуация. Если программист ее не желает, тип значения должен проверяться с помощью оператора instanceOf, как это делается в следующем примере:

Ball aBall; WhiteBall wBall;

if (aBall instanceOf WhiteBall) wBall = (WhiteBall) aBall;

else

...

Упражнения

1. Объясните, почему в языках со статическими типами данных (вроде C++ и Object Pascal) нельзя присваивать значение типа надкласса переменной, описанной как экземпляр подкласса. То есть команды вроде нижеследующих приводят к сообщению компилятора об ошибке:

2.

TextWindow X;

3.

Window Y;

4.

...

 

X := Y;

5. Предположим, что в C++ метод распределения памяти работает так, как описано в разделе 12.1. Объясните, какие могут возникнуть проблемы, если пользователь пытается обойти ограничение, описанное в упражнении 1, путем приведения типов данных,

используя команду присваивания вроде

x = (TextWindow) Y;