Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_07_Простое наследование.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
120.32 Кб
Скачать

Лекция №5 простое наследование.

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

Производные классы могут:

  • содержать новые данные-члены и функции-члены;

  • видоизменять некоторые функции-члены базового класса.

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

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

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

{

<элементы_класса Base1>

};

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

{

<элементы_класса Base2>

};

class Derived: <спецификатор_доступа> Base1, // Производный класс

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

• • •

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

{

<элементы_класса Derived>

};

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

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

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

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

public

public

protected

private

public

protected

недоступны

protected

public

protected

private

protected

protected

недоступны

private

public

protected

private

private

private

недоступны

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

Пример 1.

class Base

{

int x, y;

public:

int GetX(){return x;}

int GetY(){return y;}

};

class Derived: private Base

{

public:

Base::GetX();

};

int main()

{

int x;

Derived ob;

x=ob.GetX();

}

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

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

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

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

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

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

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

  • друзья класса.

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

Пример 2.

#include <iostream.h>

class Coord

{

int x, y;

public:

Coord(int X, int Y){x=X; у=Y;}

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

int GetX(){return x;}

int GetY(){return y;}

void SetX(int X){x=X;}

void SetY(int Y){y=Y;}

};

class OutCoord: public Coord

{

public:

OutCoord(int X, int Y): Coord(X, Y){};

void ShowX(){cout<<GetX()<<' ';}

void ShowY(){cout<<GetY()<<' ';}

};

int main()

{

OutCoord* ptr;

ptr=new OutCoord(10,20); //Coзданиe объекта в куче

ptr->ShowX();

ptr->ShowY();

cout<<"\n";

delete ptr; //Удаление объекта из кучи

}