6.2 Производные классы

---------------------

Другой случай вложенности классов основывается на понимании

класса как совокупности данных и операций над ними. При этом

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

свойств старого "базового" класса, или "наследует" их: структура

объекта старого класса включается в новый объект, а все элементы-функции старого класса применимы к объекту нового класса, точнее к его старой составляющей.


Старый класс при этом называется базовым классом (БК), новый

- производным классом (ПК).


Синтаксис определения производного класса имеет вид:


class : ,,...

{

определение приватной и публичной части

производного класса

}


Перечислим основные свойства базового и производного классов:

- объект базового класса определяется в производном классе как неименованный. Это значит, что он не может быть использован в явном виде как обычный именованный объект;

- элементы данных базового класса включаются в объект производного класса (как правило, компилятор размещает их в начале объекта производного класса). Oднако приватная часть базового класса закрыта для прямого использования в производном классе;

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

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


Пример схемы определения производного класса


class a

{

public:

void f() {}

void g() {}

}


class b : a ------------------------ базовый класс

{

public: void f() -------------------- "f" переопределяется

{ ...

a::f(); -------------- явный вызов "f" для БК

} -------------- "g" наследуется из БК

void h() {} -------------- собственная функция в ПК

}


void main()

{

a A1;

b B1;


B1.f(); --------------- вызов переопределенной b::f()

B1.g(); --------------- вызов наследуемой a::f()

}


Понятие "наследования" предполагает что при вызове в производном классе функций, наследуемых из базового, транслятор производит преобразование ссылки this на объект производного класса в

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


Взаимоотношение конструкторов и деструкторов базового и производного классов аналогичны выше описанным:

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

вызываются в обратном порядке - сначала для производного, затем

для базового;

- в заголовке конструктора производного класса может быть

явно указан вызов конструктора базового класса с параметрами. Он

может быть без имени, а может быть с именем базового класса. Если

производный класс включает в себя объекты нескольких базовых

классов, то в вызовы конструкторов базовых классов должны быть

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


6.3 Права доступа в производных классах

--------------------------------------

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

базового класса, как из элементов-функций производного класса,

так и извне - через объекты производного класса. Здесь возможны

следующие варианты:

- приватная часть базового класса A всегда включается в приватную часть производного класса B, но при этом непосредственно

недоступна из элементовфункций класса B. Это соответствует тому

факту, что в классе B разрешается работать с базовым объектом

класса A только разрешенными в классе A средствами, то есть через элементы-функции класса A. Исключение составляет объявление всего класса B дружественным в классе A;

- по умолчанию, то есть при использовании заголовка вида


class B : A { }


публичная часть класса A попадает в приватную часть класса B. Это значит, что элементы-функции класса A доступны из элементов-функций класса B, но не могут быть вызваны извне, то есть при обращении к объектам класса B. То есть для внешнего пользователя класса B интерфейс класса A закрывается;


- в противном случае, при объявлении


class B : public A { }


публичная часть класса A попадает в публичную часть класса B, и внешний пользователь при работе с объектами класса B может применить интерфейсы как производного, так и базового классов;


- и наконец, в определении публичной части класса B можно явно указать элементы-функции (а также данные) публичной части базового класса A, которые попадают в публичную часть класса B, то есть выполнить предыдущее действие селективно по отношению к отдельным элементам (при этом указывается только имя элемента):


class B : A {

...

public:

...

public A::fun;

...

}


Перечисленные варианты изображены на схеме:


class A class B

-----------¬ ----------------¬

¦ privat ======================> privat A ¦

+----------+ ¦ (недоступен B)¦

¦ public ¦ class B:A +---------------+

¦ ======================> privat B ¦

¦ ¦ ¦ (доступен B) ¦

¦ ¦ class B : public A ¦===============¦

¦ ======================> public B ¦

¦ ¦ class B : A { ... ¦ ¦

¦ ¦ public A::newadr; ¦ производного класса

L----------- L---------------

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

аналогии с дружественностью базовый класс может разрешить доступ

к своим элементам личной части в производных классах. Это делается при помощи объявления защищенных (protected) элементов.

Элемент с меткой protected в базовом классе входит в приватную часть базового класса. Кроме того, он доступен и в приватной

части производного класса. Если же базовый класс включается в

производный как public, то защищенный элемент становится защищенным и в производном классе, то есть может использоваться в последующих производных классах. Сказанное поясним примером и схемой:


class A

{

int a1; // Обычный приватный элемент

protected: int a2; // Защищенный приватный элемент

public:

}


class B : A // a1,a2 в приватной части B

{

void x();

}

void B::x()

{

a1 = 5; // Ошибка: a1 недоступен в B

a2 = 3; // a2 доступен в приватной части B

}


class B : public A // a2 доступен и защищен в приватной

{ // части B, неявно имеет место

// protected: int a2;

}


class A class B

-----------¬ ----------------¬

¦ privat ======================> privat A ¦

+----------+ ¦ (недоступен B)¦

¦ protected¦ class B:A +---------------+

¦ ======================> privat B ¦

¦ ===============¬ ¦ (доступен B) ¦

+----------+ class B: public A +---------------+

¦ public ¦ L======> protected B ==========>

¦ ¦ ¦===============¦

¦ ¦ ¦ public ¦



Информация о работе «Объективное программирование»
Раздел: Информатика, программирование
Количество знаков с пробелами: 61028
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
14044
1
2

... обучающих программ Обучающие программы, построенные на бихевиористской основе, подразделяют на: а) линейные, разработанные Скиннером, б) разветвленные программы Н. Краудера. 1. Линейная система программированного обучения, первоначально разработанная американским психологом Б. Скиннером в начале 60-х гг. ХХ в. на основе бихевиористского направления в психологии. ·  Он выдвинул следующие ...

Скачать
93027
12
0

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

Скачать
109055
0
0

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

Скачать
165676
21
12

... отбора. ГЛАВА II. ЦЕЛЬ, ЗАДАЧИ, МЕТОДЫ И ОРГАНИЗАЦИЯ ИССЛЕДОВАНИЯ   2.1 Цель и задачи исследования Цель исследования - повышение эффективности физической подготовки вратарей учебно-тренировочных групп на соревновательном этапе. В процессе реализации поставленной цели решались следующие основные задачи: 1.     Изучить особенности возрастного развития двигательных способностей футболистов ...

0 комментариев


Наверх