Читать в оригинале

<< ПредыдущаяОглавлениеСледующая >>


2.2.2 Семантика присваивания

Рассмотрим присваивание: x = e.

Чтобы присваивание было допустимым, типы переменной x и выражения e должны быть согласованными. Пусть сущность x согласно объявлению принадлежит классу T. Будем говорить, что тип Ti основан на классе T и является базовым типом x, так что базовый тип определяется классом объявления. Пусть теперь в рассматриваемом нами присваивании выражение e связано с объектом типа Ti. Тип Ti согласован по присваиванию с базовым типом T переменной x, если класс Ti является потомком класса T. Присваивание допустимо, если и только если имеет место согласование типов.

Например, пусть задан некоторый класс Parent, а класс Child - его потомок, объявленный следующим образом: class Child : Parent {...}

Пусть теперь в некотором классе объявлены переменные этих классов и созданы связанные с ними объекты:

Parent pi = new Parent(), p2 = new Parent();
Child chi = new Child(), ch2 = new Child();

Тогда допустимы присваивания:

pi = p2; p2 = pi; chi = ch2; ch2 = chi; pi = chi; pi = ch2;

Но недопустимы присваивания:

chi = pi; ch2 = pi; ch2 = p2;

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

pi = chi; ... chi = (Child)pi;

Семантика присваивания справедлива и для другого важного случая - при рассмотрении соответствия между формальными и фактическими аргументами процедур и функций. Если формальный аргумент согласно объявлению имеет тип T, а выражение, задающее фактический аргумент, имеет тип Ti , то имеет место согласование типов формального и фактического аргумента, если и только если класс Ti является потомком класса T. Отсюда незамедлительно следует, что если формальный параметр процедуры принадлежит классу Object, то фактический аргумент может быть выражением любого типа.

 



<< ПредыдущаяОглавлениеСледующая >>