Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козин С. В. ООП. Лекции.doc
Скачиваний:
57
Добавлен:
06.07.2020
Размер:
489.47 Кб
Скачать

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

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

A

  • int n;

  • int m;

B

-int k;

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

B b;

Изобразим диаграмму объекта 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. Если бы сокрытие информации осуществлялось за счет управления видимостью, то сообщение об ошибке появляться не должно.

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

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

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

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

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

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

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

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

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

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