Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SHPORS~1.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
201.73 Кб
Скачать

10. Наследование классов. Конструкторы базового класса.

Базовый класс: class A{int i; public: void tf();}

Производный класс: class B::public A{ int j; public: void tf();}

void f() {B b1; b1.j=0; b1.i=0; b1.tf();}

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

Пример: class Employee {char *name; public:…} class Manager:public Employee {int level; public:…} void f() {Employee *x; Manager *y; x=y;//Ok сузили от менеджера до работника; y=x;//Err} //каждый менеджер – сотрудник, но не каждый сотрудник – менеджер.

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

Class Employee{string first_name, family_name; short department;//…public: Employee(const string&n, int d);//…}; class Manager:public Employee{ set<Employee*>group; //подчиненные short level; //…public: Manager(const string&n,int d,int lvl);//…};

Аргументы конструктора базового класса указываются в определении конструктора производного класса. В этом отношении базовый класс ведет себя как член производного класса. Например: Employee::Employee(const string&n,int d):family_name(n), department(d){//…} Manager:Manager(const string&n,int d,int lvl):Employee (n,d), //инициализация базового класса level (lvl)//иниц членов{//…};

Конструктор производного класса может указать инициализаторы для собственных членов и членов базового класса; он не может непосредственно инициализировать члены базового класса.

Объекты класса создаются снизу-вверх: сначала базовый класс, члены и производный класс. Они уничтожаются в противоположном порядке.

11. Обмеження доступу до базового класу.

Аналогично членам класса, базовый класс можно объявить закрытым (private), защищенным (protected) или открытым (public). Например: class X: public B{//..};

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

Спецификатор доступа к базовому классу можно опустить. В этом случае, если базовым является класс, наследование будет закрытым, а если базовой является структура – то открытым. Чтобы сделать код более читаемым, лучше использовать явный спецификатор.

Спецификатор доступа к базовому классу управляет доступом к членам базового класса и преобразованием указателей и ссылок из типа производного класса в тип базового класса. Рассмотрим класс Д, производный от базового класса В.

1. Если В является закрытым базовым классом, его открытые и защищенные члены м/б использованы только функциями-членами и друзьями Д. Только друзья и члены Д могут преобразовывать Д* в В*.

2. Если В явл защищенным базовым классом, его открытые и защищенные члены м/б использованы только фн-членами и друзьями класса Д и его производных классов. Только *** могут ***.

3. Если В явл открытым базовым классом, его открытые члены м/б использованы любой функцией. Кроме того, его защищенные члены м/б исп-ны членами и друзьями класса Д и его производных. Любая фн может преобразовывать Д* в В*.

Примеры: class X{}; class A:public X{}; (любая фн может позволить себе неявное преобразование указателя) class B:protected X{}; (фн-и кл В и производных классов может позволить себе неявное преобр указателя) class D:public B{}; class C:privare X{}; (только фн класса С ***)

1. void f(X *px; A *pa; B *pb; C *pc){px=pa; pa->i=0; px=pb;//Err pb->i=0;//Err px=pc;//Err pc->i=0;//Err }

2. void f(X *px; A *pa; B *pb; C *pc){px=pa; pa->i=0; px=pb; pb->i=0; px=pc;//Err pc->i=0; //Err}

3. void f(X *px; A *pa; B *pb; C *pc){px=pa; pa->i=0; px=pb; //Err pb->i=0; //Err px=pc; pc->i=0; }

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