Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 13

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

 с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.

22.2 Конструкторы, деструкторы и наследование