Совместимость типов
Наследование предъявляет свои требования к правилам совместимости типов.
В добавление ко всему прочему, порожденный тип наследует совместимость со всеми типами предка. Эта расширенная совместимость имеет три формы:
Однако во всех трех формах необходимо запомнить, что совместимость типов распространяется от потомка к предку. Другими словами, порожденные классы можно свободно использовать вместо классов предка, но не наоборот.
Например,
Point APoint, *ptrPoint;
Circle ACircle, *ptrCircle;
При наличии этих объявлений следующие присваивания являются законными:
APoint = ACircle;
Обратные присваивания незаконны.
Родительскому объекту можно присваивать объект любого порожденного им класса.
Чтобы было проще запомнить путь совместимости типов, давайте рассуждать таким образом:
1. источник должен полностью заполнять объект назначения,
2. порожденные типы содержат все, что содержат родительские типы посредством наследования. Следовательно, порожденный тип будет иметь или тот же размер, или (обычно) размер больший, чем его предок, но никогда не меньший размер.
Присваивание родительского объекта порожденному может оставить некоторые поля потомка неопределенными после присваивания. Что весьма опасно.
В предложениях присваивания будут копироваться только те поля, которые являются общими для обоих типов, то есть только поля предка.
Совместимость типов также действует между указателями на классы. Указатели на потомков можно присваивать указателям на предков по тем же общим правилам, как и для экземпляров объекта.
Формальный параметр объекта заданного класса может использовать в качестве фактического параметра объект такого же класса или любого порожденного класса. Например,
void Proc (Point param)
Тогда фактические параметры могут иметь тип Point, Circle и любой другой порожденный от них тип.
[назад] | [оглавление] | [вперед] |