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

3. Простое и множественное наследование

Язык C++ позволяет классу наследовать данные-члены и функции-члены одного или нескольких других классов. При этом новый класс называют производным классом (или классом-потомком). Класс, элементы которого наследуются, называется базовым классом (родительским классом или классом-предком) для своего производного класса. Наследование дает возможность некоторые общие черты поведения классов абстрагировать в од­ном базовом классе. Производные классы, наследуя это общее поведение, могут его несколько видоизменять, переопределяя некоторые функции-члены базового класса, или дополнять, вводя новые данные-члены и функции-члены. Таким образом, опреде­ление производного класса значительно сокращается, поскольку нужно определить только отличающие его от производных клас­сов черты поведения.

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

class Basel //Базовый класс

{

//...

};

class Base2 //Базовой класс

{

//...

};

class BaseN //Базовый класс

{

//...

};

//Производный класс

class Derived : <спецификатор_доступа> Basel,

<спецификатор_доступа> Base2,

,

<спецификатор_доступа> BaseN

{

//...

};

Здесь <спецификатор_доступа> — это public, protected или private; он не является обязательным и по умолчанию принимает значение private для классов и public для структур. Спецификатор доступа при наследовании опреде­ляет уровень доступа к элементам базового класса, который по­лучают элементы производного класса. В приведенной ниже таб­лице описаны возможные варианты наследуемого доступа.

Таблица 6.2.Наследуемый доступ

Спецификатор наследуемого доступа

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

Доступ в производ­ном классе

public

Public

Protected

Private

Public

Protected

Недоступны

protected

Public

Protected

Private

Protected

Protected

Недоступны

private

Public

Protected

Private

Private

Private

Недоступны

Как следует из таблицы, спецификатор наследуемо­го доступа устанавливает тот уровень доступа, до которого по­нижается уровень доступа к членам, установленный в базовом классе. Из этого правила можно сделать исключения. Если спе­цификатор наследуемого доступа установлен как private, то public-члены базового класса будут являться private-членами в производном классе. Однако можно сделать некоторые из членов базового класса открытыми в производном классе, объ­явив их в секции public производного класса. Например,

class Base

{

int х,у;

public:

Int GetX(){return X;}

Int GetY(){return у;}

};

class Derived : private Base

{

public:

Base::GetX();

};

main()

{

int x;

Derived ob;

x = ob.GetX() ;

return 0;

}

Таким образом, при таком наследовании открытые и защи­щенные члены базового класса будут доступны только для чле­нов данного производного класса, и все члены базового класса, кроме явно объявленных в разделе public или protected, будут закрытыми для следующих производных классов. Этот прием позволяет отсечь доступ к членам базового класса при по­строении иерархии классов с отношением родитель — потомок.

Отметим, что при любом способе наследования в производ­ном классе доступны только открытые (public-) и защищенные (protected-) члены базового класса (хотя наследуются все члены базового класса). Иначе говоря, закрытые члены базового класса остаются закрытыми, независимо от того, как этот класс наследуется.

В С++ не могут наследоваться следующие члены класса:

конструкторы;

конструкторы копирования;

деструкторы;

операторы присвоения, определенные программистом;

Если у производного класса имеется всего один базовый класс, то говорят о простом (или одиночном) наследовании. Сле­дующий пример иллюстрирует простое наследование.

#include <iostream.h>

class Coord

{

int x, у;

public:

Coord (int _x, int _y) {x = _x; у = _y;}

Coord(){x = 0; у = 0;}

Соседние файлы в папке ЛекцииКарасева