Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабник по C.pdf
Скачиваний:
74
Добавлен:
01.06.2015
Размер:
876.9 Кб
Скачать

– 47 –

//Статическая функция

static void f() {cout<<“Я - статическая функция”<<a<<endl; } };

int MyClass::a=66;// Инициализация статической переменной void main() {

MyСlass mc; MyСlass::f(); mc.f();

f();

}

Вид информации на экране дисплея:

Я- статическая функция 66

Я- статическая функция 66

Я- глобальная функция

13. ПРОИЗВОДНЫЕ КЛАССЫ, НАСЛЕДОВАНИЕ

13.1. ИЕРАРХИЯ КЛАССОВ

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

Сконструируем класс Person на основе двух классов: Name и Job. Иерархия классов выглядит следующим образом:

Name

Job

Person

Классы Name и Job называются базовыми для производного класса Person. Поля и функции, которые определены в базовых классах, могут быть использованы в производном. Использование компонентов базовых классов в производных называется наследованием. Программа выглядит следующим образом:

struct Name{

char *FirstName; // Имя char *SurName; // Фамилия Name( char *Fn, char *Sn );

{ cout<<”Конструктор класса Name”<<endl; FirstName=Fn; SurName=Sn;}

~Name() { cout<<”Деструктор класса Name”<<endl; } };

struct Job{

char *Company; //Название компании char *Position; // Должность

Job (char *Co, char *Po)

{ cout<<”Конструктор класса Job”<<endl; Company=Co; Position=Po;}

~Job() { cout<<”Деструктор класса Job”<<endl; } };

struct Person: Name, Job {

// Собственные компоненты производного класса int Age; // возраст

char Sex; // пол

Person ( char *Ifn, char *Isn, char *Ico, char *Ipo, int Ia, char *Is): Name (Ifn, Isn), Job(Ico, Ipo) // Список конструкторов базовых классов

{cout<<”Конструктор класса Person”<<endl; Age=Ia; Sex=Is;}

~Person() {cout<<”Деструктор класса Job”<<endl; }

© 1998 Калачев Д.П., Лутай В.Н.

– 48 –

};

void main() {

Person Pl (”Владимир”, ”Сидоров”, ”SoftSci”, ”Программист”, 30, ”муж” );

}

Благодаря наследованию поля FirstName, SurName, Company и Position, определенные в базовых классах, доступны в производном. Доступны в этом классе и конструкторы базового класса.

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

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

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

Конструктор класса Name Конструктор класса Job Конструктор класса Person Деструктор класса Person Деструктор класса Job Деструктор класса Name

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

Заметим, что при построении иерархии классов полезно попытаться ответить на вопрос: «Что из себя представляет объект?». Например, «Что такое окружность? Окружность – геометрическое место точек, равноудаленных от центра. Что такое многоугольник? Многоугольник – фигура, состоящая из ломаных линий. Что такое линия? Линия-совокупность точек». Исходя из этого целесообразно для классов «Окружность» и «Многоугольник » в качестве базового выбрать класс «Точка».

Формат определения производного класса следующий:

тип_класса имя_класса : [модификатор_доступа]список_базовых_классов{ ...};

13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ

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

© 1998 Калачев Д.П., Лутай В.Н.