Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.DOC
Скачиваний:
13
Добавлен:
03.05.2019
Размер:
618.5 Кб
Скачать

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

Как уже отмечалось, производный класс наследует все содержимое базового, хотя и с некоторыми ограничениями (закрытые члены базового класса непосредственно недоступны в производном). Таким образом, производный класс шире базового. (рис. 4.1).

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

Рис. 4.1. Состав объекта производного класса

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

Защищенные члены класса

В последнем примере данные-члены обоих классов объявлены (по умолчанию) закрытыми, как это обычно и делается. Однако к закрытым данным базового класса нельзя обратиться из производного. Решить эту проблему можно двумя способами: предусмотреть в базовом классе открытые функции для доступа к данным или объявить данные базового класса защищенными (protected). Защищенные данные по-прежнему закрыты для программы, которая не может их случайно разрушить, однако из функций производного класса к ним доступ есть. Модифицируем последний пример, объявив данные базового класса защищенными и введя в производный класс функцию Print() для их распечатки:

class Men{

protected:

char* name; int age;

public:

void Set(char* n, int a){name=n; age=a;}

};

class MenEx:public Men{

int wages;

public:

void Set(char*n,int a,int w){//Заместим функцию Men::Set()

name=n; age=a; wages=w;

}

void Print(){

char txt[50];

wsprintf(txt,”Имя: %s\nВозраст: %d\nЗарплата: %d”,

name, age, wages);

MessageBox(NULL,txt,”MenEx”,MB_OK);

}

};

Поскольку защищенные данные базового класса непосредственно доступны в производном, отпала необходимость вызова функции Set() базового класса в замещающей функции Set() класса MenEx; в ней можно инициализировать данные обоих классов. В новой функции Print() с помощью вызова wsprintf() форми­руется символьная строка с содержимым объекта, выводимая затем в окно сообщения. Ниже приведен фрагмент программы, в которой создается, инициализируется и выводится на экран объект класса MenEx (в предположении, что оба класса описаны ранее, например, в подсоединенном к программе заголовочном файле).

MenEx* pm=new MenEx();

pm->Set("Хромов",22,5000);

pm->Print();

Вывод программы показан на рис. 4.2.

Рис. 4.2. Вывод в окно сообщения содержимого класса

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]