Имеет место т.н. наследование классов. Причем производные классы, в свою очередь, могут быть базовыми для других производных от них классов. Синтаксис наследования имеет следующий вид:
сlassBase
{.
.
.
};
сlassDerived: ключ_доступа Base
{.
.
.
};
Ключ_доступа не является обязательным и может быть private, protected или public. Если он не указан, то по умолчанию принимается private для классов и public для структур.
Ключ_доступа определяет уровень доступа к элементам базового класса. Ниже приводится таблица с вариантами доступа.
|
Ключ_доступа |
Доступ в базовом классе |
Доступ в производном классе |
|
public |
рublic рrotected private |
рublic рrotected private |
|
protected |
рublic рrotected private |
рrotected рrotected private |
|
private |
рublic рrotected private |
рrivate рrivate рrivate |
В последнем случае имеет место доступ лишь к членам-функциям базового класса (если они в области действия метки доступа рublic).
Наследование бывает простым и множественным. Простым наследованием называется случай, когда производный класс имеет всего один базовый класс. При множественном наследии класс является производным от нескольких базовых классов.
Пример.
сlass А
{.
.
.};
сlass В
{..
.
};
сlass С: рublic А, рublic В
{.
.
};
Здесь класс Сявляется производным от базовых для него классов А и В. Рассмотрим пример простого наследования. Базовый - class man. Производный - сlass student. Напомним, что метка доступа рrotected в базовом классе позволяет иметь доступ из производного класса к элементам базового, находящимся в области действия этой метки.
#include <stdio.h>
class man
{рrotected:
char *name;//имя
char *address;//адрес
int age;//возраст
рublic:
void get_man_info()
{name=new char[15];
address=new char[20];
puts("Введите имя");fflush(stdin);
scanf("%s",name);puts("Введите адрес");fflush(stdin);
scanf("%s", address );puts("Введите возраст");scanf("%i", &age );}
void put_man_info()
{printf("Имя человека %s.Его адрес % s. Возраст %i\n", name, address, age);}
}:
//Закончилось описание класса man
class student:public man
{char *group; //группа
рublic:
void get_stud_info()
{group = new char[10];
puts("Введите группу");fflush(stdin);
scanf("%i",group );}
void put_stud_info()
{printf("Имя студента %s.Его адрес % s. возраст. Учится в группе% s \n",name,address,age, group);//Используются элементы-данные из базового класса.
}
}
voidmain
{manx;//Элемент базового класса
x.get_man_info();
x.put_man_info();
studenty; //Элемент производного класса
y.get_man_info();
y.get_stud_info();
y.put_stud_info();
}
Здесь объект производного класса y вызывает функцию get_man_info(), являющуюся членом-функцией базового класса man. При вызове y.put_stud_info() будут выведены y.name, y.address, y.age и y.group.
В принципе, class student мог бы быть базовым, например, для class stud_sport (студент-спортсмен). Для этого в class student метку доступа к элементу данных group нужно сделать рrotected. Тогда объекты класса stud_sport смогут использовать элементы-данные и члены-функции как класса student, так и класса man, являющегося базовым для класса student.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.