Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_CPP.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
311.81 Кб
Скачать
  1. Доступ к членам наследуемого класса

При определении производного класса можно также определить права доступа к членам, наследуемым от базового класса. Для этого в определении производного класса перед именем базового класса записывается один из спецификаторов доступа: public, protected или private. Если класс наследуется как public, то права доступа к public и protected членам, наследуемым от базового класса, в производном классе не изменяется.

Если класс наследуется как protected, то все public и protected – члены базового класса, становятся protected-членами производного класса.

Если класс наследуется как private, то все public и protected – члены, наследуемые от базового класса, становятся private-членами производного класса.

В любом случае private-члены базового класса становятся private-членами производного класса. При чем доступ к этим членам закрыт в производном классе. Чтобы открыть этот доступ, производный класс должен быть объявлен другом базового класса. Если спецификатор доступа перед базовым классом опущен, то по умолчанию для классов он устанавливается в private, а для структур – в public.

  1. Конструкторы, деструкторы и наследование

Конструкторы не наследуются, но при создании нового объекта производного класса, компилятор всегда вызывает конструктор по умолчанию базового класса. Чтобы изменить такую инициализацию объекта производного класса, нужно в списке инициализаций конструктора производного класса явно вызвать требуемый конструктор базового класса.

При инициализации любого объекта конструкторы вызываются в следующем порядке:

  1. Конструкторы базовых классов. Если таких классов несколько, то и конструкторы вызываются в порядке следования этих классов в списке базовых классов.

  2. Конструкторы объектов членов класса. Если таких объектов несколько, то и конструкторы вызываются в порядке объявления этих объектов класса.

  3. Конструктор производного класса.

Деструкторы не наследуются, но при уничтожении объекта всегда вызываются деструкторы базовых классов в порядке, обратном вызову конструкторов.

  1. Наследование и присваивание.

В языке программирования С++ базовый класс совместим по типу со всеми производными от него классами, поэтому объекты производных классов можно присваивать объекту базового класса, но не наоборот.

Операторы присваивания не наследуются, т.к. при отсутствии оператора присваивания в производном классе компилятор генерирует для этого класса оператор присваивания по умолчанию, который вызывает операторы присваивания для базовых классов и выполняет тривиальное копирование членов данного производного класса.

  1. Виртуальные функции.

Язык программирования С++ обеспечивает механизм для вызова функции производного класса в случае, если доступ к объекту производного класса осуществляется через указатель или ссылку на базовый класс. Для этого в производном классе должна быть определена функция, имя и набор параметров которой совпадают с именем и набором параметров функции базового класса. Причем функция базового класса должна быть объявлена со спецификатором virtual. В этом случае говорят, что функция производного класса замещает функцию базового класса.

Замечание: 1. Повторять ключевое слово virtual в производном классе при замещении функции базового класса не обязательно.

  1. функция, объявленная в базовом классе со спецификатором virtual, а также все функции, замещающие её в производных классах, называются виртуальными. Виртуальная функция не может быть статическим членом класса.

  2. если виртуальные функции базового и производного классов отличаются только типом возвращаемого значения, то компилятор выдаст ошибку. Но при этом следует учитывать, что указатель и ссылка на базовый класс совместимы по типам с указателем и ссылкой на производный класс соответственно. Поэтому виртуальная функция производного класса может возвращать соответственно указатель или ссылку на класс, который является производным от класса, указатель или ссылку на который возвращает замещаемая виртуальная функция базового класса.

  3. если виртуальная функция производного класса имеет такое же имя, что и виртуальная функция базового класса, но другой список параметров, то виртуальная функция в производном классе просто скрывает соответствующую виртуальную функцию в базовом классе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]