Операция присваивания и принцип подстановки
Открытое наследование устанавливает между классами отношение «является»: класс−наследник является разновидностью класса−родителя. Это означает, что везде, где может быть использован объект базового класса (при присваивании, при передаче параметров и возврате результата), вместо него разрешается подставлять объект производного класса. Данное положение называется принципом подстановки и поддерживается компилятором. Этот принцип работает и для ссылок, и для указателей: вместо ссылки (указателя) на базовый класс может быть подставлена ссылка (указатель) на класс−наследник. Обратное − неверно! Например, спортсмен является человеком, но не всякий человек — спортсмен. Здесь человек — базовый класс, а спортсмен — производный.
Помимо конструкторов, не наследуются два вида функций: операция присваивания и дружественные функции. Операция присваивания, как и конструкторы с деструктором, для любого класса создается автоматически.
В теле дочерней операции присваивания выполняется вызов родительской операции в функциональной форме. Эта операция похожа на операцию преобразования объектов базового класса в производный.
В любом классе операцию присваивания можно перегрузить неоднократно. При этом разрешается, чтобы ни аргумент, ни результат не являлись определяемым классом. Единственным ограничением является видимость определения нужных классов в точке определения операции присваивания.
Дружественные функции не наследуются, поскольку не являются методами базового класса, хотя и имеют доступ к внутренней структуре класса. При открытом наследовании можно не дублировать дружественные функции для производного класса, так как принцип подстановки обеспечивает помещение аргументов производного класса на место параметров базового класса.
Если в производном классе определены дополнительные поля, то при подстановке объектов происходит срезка (расщепление): объекту базового класса присваиваются только унаследованные производным классом поля. При передаче параметра по значению может произойти срезка при копировании. При передаче параметра по ссылке (или по указателю) срезки не происходит.
Дата добавления: 2015-07-30; просмотров: 841;