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

Лекция 7

Наследование классов

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

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

class <имя производного класса>:<спецификатор><имя базового класса>

{<список элементов производного класса>};

Здесь <спецификатор>- это ключевое слово public или protected(защищенный) или private.

Защищенным является элемент, который открыт для производных классов, но закрыт вне иерархии классов.

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

Например:

class b

{float f;

protected:

int t;

public: char a;

};

Определим производный класс:

class v: public b{//элементы производного класс};

/* f- private; t- protected; a- public */

Если базовый класс наследуется как protected, то все его открытые и защищенные элементы становятся защищенными членами производного класса. Элементы со статусом private остаются закрытыми.

Например:

class d: protected b{…};

/* f-private; t, a- protected */

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

class m: private b{…};

/* f,t,f- private */

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

Пример:

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

#include <iostream.h>

#include <string.h>

class GEOM

{public:

double w,h;

void show()

{cout<<”w=”<<w<<” “<<”h=”<<h<<’\n’;}

};

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

class TR:public GEOM

{public:

char type_tr[80];//тип треугольника

double area()

{return w*h/2;}

void showtype()

{cout<<type_tr<<’\n’;}

};

void main()

{ TR t;

t.w=4.0;

t.h=4.0;

strcpy(t.type_tr, “равнобедренный”);

cout<<”Информация о треугольнике:\n”;

t.showtype();//метод производного класса

t.show();//метод базового класса

cout<<”Площадь=”<<t.area()<<’\n’;

}

Результат

Информация о треугольнике

равнобедренный

w=4 h=4

Площадь=8

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

class R: public GEOM

{public:

double area()

{return w*h;}

};

Класс R добавляет к базовому классу GEOM функцию area(), вычисляющую площадь прямоугольника.

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

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

1.можно закрытым элементам базового класса присвоить статус protected;

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

Вернемся к последнему примеру. Объявим поля w и h класса GEOM закрытыми добавим в этот класс функции доступа к этим полям.

#include <iostream.h>

#include <string.h>

class GEOM

{ double w,h;//private

void show()

{cout<<”w=”<<w<<” “<<”h=”<<h<<’\n’;}

double getw()

{return w;}

double geth()

{return h;}

void setw(double v)

{w=v;}

void seth(double p)

{h=p;}

};

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

class TR:public GEOM

{public:

char type_tr[80];//тип треугольника

double area()

{return getw()*geth()/2;}

void showtype()

{cout<<type_tr<<’\n’;}

};

void main()

{ TR t;

t.setw(4.0);

t.seth(4.0);

strcpy(t.type_tr, “равнобедренный”);

cout<<”Информация о треугольнике:\n”;

t.showtype();//метод производного класса

t.show();//метод базового класса

cout<<”Площадь=”<<t.area()<<’\n’;

}