Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures_2.doc
Скачиваний:
28
Добавлен:
15.03.2015
Размер:
511.49 Кб
Скачать

Структура объекта порожденного класса

Пусть имеются два класса AиB, связанные отношением наследования.

A

  • int n;

  • int m;

B

-int k;

Предположим, что в клиентском коде имеется следующее определение переменной b:

Bb;

Изобразим диаграмму объекта b.

b : B

n = 0

m = 0

k = 0

Объект b,будет содержать три поля с именамиn,mиk. Два из них (nиm) рассматриваемый объект наследует от базового класса, а полеkявляется его собственным полем. На диаграмме показаны значения, которыми были предположительно инициализированы эти поля.

Доступ к элементам базового класса

Доступность элементов базового класса в порожденном классе зависит от вида наследования.

Вид наследования

Права доступа в базовом классе

Права доступа в порожденном классе

public

private

private

protected

protected

public

public

Protected

private

private

protected

protected

public

Private

private

private

protected

Public

Обсуждение.

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

// Файл Сlasses.h class A { private: int n; }; class B : public A { public: void foo(); }; // Файл B.cpp int n; void B :: foo() { int n = 5; // ... }

При компиляции рассматриваемого программного кода будет выведено сообщение об ошибке Дело в том, что в теле функции foo() видна закрытая переменная – член базового класса А. Эта переменная скрывает глобальную переменнуюn, объявленную в файлеB.cpp. Если бы сокрытие информации осуществлялось за счет управления видимостью, то сообщение об ошибке появляться не должно.

Итак, очень важный вывод состоит в том, что все закрытые элементы базового класса в порожденном классе видны, но недоступны. Заметим, что в других объектно-ориентированных языках могут быть приняты свои способы сокрытия информации. Например, в ObjectPascalDelphiэто осуществляется за счет управления видимостью.

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

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

При public– наследовании открытый интерфейс базового класса входит составной частью в интерфейс порожденного класса. Можно говорить о том, что приpublic– наследовании наследуется интерфейс базового класса.

При использовании protected– наследования иpublic– наследования интерфейс базового класса клиентам базового класса не предоставляется. В этом случае можно говорить о наследовании реализации.

Имеется ряд элементов базового класса, которые не наследуются. К их числу относятся:

  • конструкторы.

  • Деструктор.

  • Перегруженный оператор присваивания.

Основным видом наследования в языке C++ являетсяpublic– наследование. Именно при этом виде наследования реализуются все фундаме

Соседние файлы в предмете Программирование