5. Наследование

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

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

Класс, который наследует называет, называется производным классом.

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

Наследование, при котором указывается один базовый класс, называется простым.

Если указываются несколько классов, то наследование называется множественным.

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

class имя класса : public имя базового класса

Например, class D: public A

{ … }

После имени класса D имеется двоеточие, за которым следует ключевое слово public и имя класса A. Для компилятора это указание на то, что класс D будет наследовать все компоненты класса A. Само ключевое слово public информирует компилятор о том, что, поскольку класс A будет наследоваться, значит, все открытые элементы базового класса будут также открытыми элементами производного класса. Однако все закрытые элементы базового класса останутся закрытыми и к ним не будет прямого доступа из производного класса. Причина, по которой закрытые члены класса становятся недоступными для производных классов – поддержка инкапсуляции. Если бы закрытые члены класса становились открытыми просто посредством наследования этого класса, инкапсуляция была бы совершенно несостоятельна.

При множественном наследовании объявление выглядит так:

class D: public A [, public C]

{ тело класса D}

Рассмотрим пример:

enum Bool

{false, true}; //константы сводятся к int. Они изменяются с шагом равным единице.

class Point: public Location

{protected:

Bool vis;

public:

Point (int _x, int _y);

void Show();

void Hide();

};

Point::Point (int_x, int_y) : Location(_x, _y)

{vis=false;}

Здесь класс Point наследует свойства базового класса Location.

Наследование и контроль доступа

Спецификатор доступа определяет то, как элементы базового класса наследуются производным классом. Если спецификатором доступа наследуемого базового класса является ключевое слово public, то все открытые члены базового класса остаются открытыми и в производном. Если спецификатором доступа наследуемого базового класса является ключевое слово private, то все открытые члены базового в производном классе становятся закрытыми. В обоих случаях все закрытые члены базового класса в производном классе остаются закрытыми и недоступными.

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

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

Доступ

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

Доступ компонентов

в базовом классе

Доступность компонентов

базового класса в

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

public

private

protected

public

Нет доступа

protected

public

protected

private

protected

public

Нет доступа

protected

protected

private

private

protected

public

Нет доступа

private

private


 

6. Указатель this

Когда функция, принадлежащая классу, вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого функция вызвана. Этот указатель имеет фиксированное имя this и незаметно для программиста (“тайно”) определен в каждой функции класса следующим образом:

имя_класса * const this=адрес обрабатываемого объекта;

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

Таким образом, каждая нестатическая функция – элемент класса имеет доступ к объекту, для которого она вызвана через указатель this.

Рассмотрим пример:

comp &operator+(comp)

{real=real+x.real;

im=im+x.im;

return *this;}

В примере реализована для класса comp перегрузка операции сложения. Здесь последовательно складываются действительные и мнимые части. Возвращение результата происходит через указатель this. Если нужно вернуть адрес объекта, то пишется return this.

 


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

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

Скачать
35016
10
1

... различных свойств. В результате выполнения методов объекта могут происходить новые события, воспринимаемые другими объектами программы или пользователем. 2. Интегрированная среда разработки Delphi: назначение и общее описание среды   Delphi – это потомок среды программирования Turbo Pascal. Название среды произошло от названия города в Древней Греции, где находился знаменитый Дельфийский ...

Скачать
69354
1
0

... , сколько времени потребуется для его составления, как много места для возможных ошибок? Естественно, об этом задумывались и авторы языков программирования. Поэтому во всех существующих языках имеются типы переменных, отвечающие за хранение больших массивов данных. В языке Паскаль они так и называются: "массивы".    Массивом будем называть упорядоченную последовательность данных одного типа, ...

Скачать
51776
17
0

... урожай который может быть обеспечен генетическим потенциалом сорта и приходом ФАР при реально существующих среднемноголетних условиях и применением агротехники. В Свердловской области величина действительно возможного урожа в основном определяется влагообеспеченностью, особенно продуктивной ее частью, которая рассчитывается по данным годового количества осадков. Таблица 7 Среднемноголетние ...

Скачать
39078
10
0

... следует до заморозков. Засилосованные початки в молочно – восковой спелости приравниваются по количеству кормовых единиц (на сухое вещество) к спелому зерну кукурузы. Следовательно, целесообразно их убирать и силосовать отдельно от стеблей и листьев. Технология возделывания и уборки кукурузы Уточни с препадом на счет дат и вид работ. 1 и 2 переставь местами строчки. № Виды работ Объем ...

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


Наверх