Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Классы. Принцип наследования. Создание иерархии классов.




Классы могут находиться в отношении наследования, при котором формируется иерархия классов, а также иерархия соответствующих им объектов. Иерархия классов позволяет определять новые классы на основе уже имеющихся

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

 class Base

 { // Базовый класс Человек

 Person p;

    public:

 Base () {...}

 Person get() {return p;}

 int put (Person x) {...}

 };

Здесь p – структура, с полями для хранения имени, фамилии и возраста человека:

struct Person // просто Человек

 

{

 char firstname[10];

 char lastname[15];

 int age;

};

В базовом классе Base определены открытые методы get и put, обеспечивающие доступ к закрытому полю p, и конструктор класса.

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

Класс Employee определен следующим образом:

class Employee: protected Base

{ // Производный класс Служащий

 char post[15];

 double salary;

 static double percent;

 public:

 Employee (double x = 0.13) {...}

 double payment() {return salary*(1-percent);}

};

 

В заголовке производного класса после его имени и символа двоеточие указывается имя его непосредственного предка (его базового класса). Кроме разделов private и public, в базовом классе может быть объявлен раздел со статусом видимости protected (защищенный), поля и методы которого доступны лишь для методов его потомков.

 

Наследование полей и методов. Изменение статуса видимости полей и методов при наследовании.

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

Рассмотрим в качестве примера простой иерархии набор из трех классов – базового и двух производных

Базовый класс определим следующим образом:

 class Base

 {// Базовый класс Человек

 Person p;

 public:

 Base () {...}

 Person get() {return p;}

 int put (Person x) {...}

 };

Здесь p – структура, с полями для хранения имени, фамилии и возраста человека:

struct Person // просто Человек

 

{

 char firstname[10];

 char lastname[15];

 int age;

};

В базовом классе Base определены открытые методы get и put, обеспечивающие доступ к закрытому полю p, и конструктор класса.

Наследниками базового класса являются производные классы Student и Employee. Класс Employee определен следующим образом:

class Employee: protected Base

{ // Производный класс Служащий

 char post[15];

 double salary;

 static double percent;

 public:

 Employee (double x = 0.13) {...}

 double payment() {return salary*(1-percent);}

};

В этом классе, кроме унаследованного поля p, определены дополнительные поля post (должность), salary (оклад) и статическое поле percent (процент удержания). В открытой части класса определены конструктор и метод payment, возвращающий значение выплат после вычета удержаний.

Класс Student определен следующим образом:

class Student: public Base // Производный класс

{ short year;

 bool grant;

 float marks[8];

 public:

 Student () {…}

 shortget_year () {…}

 bool get_grant () {…}

 float get_marks (int i) {…}

 int put_year (short x) {…}

 void put_grant (bool x) {…}

 int put_marks (float x, int i) {…}

};

В этом классе, кроме унаследованного поля p, определены дополнительные поля year (год обучения), grant (стипендия) и поле-массив marks (средние семестровые оценки). В открытой части класса определены конструктор и методы доступа к полям

.

В заголовке производного класса после его имени и символа двоеточие указывается имя его непосредственного предка (его базового класса). Кроме разделов private и public, в базовом классе может быть объявлен раздел со статусом видимости protected (защищенный), поля и методы которого доступны лишь для методов его потомков.

Производный класс наследует все поля и методы базового класса. При этом статус видимости унаследованных элементов базового класса может измениться в классах-потомках.Чтобы этого не произошло перед именем базового класса в заголовке класса-потомка нужно указать спецификатор доступа public:

 class Student: public Base

Если перед именем базового класса указать спецификатор доступа privateили protected, то открытые члены базового класса перестают быть непосредственно доступными объектам классов- потомков

Например:

 class Employee: private Base

Спецификатор privateпредполагается используемым по умолчанию.

 

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 218.

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