
- •1. Типи знань і методи їх представлення.
- •2. Парадигми імперативного стилю. Підтримка в мовах програмування. Парадигма процедурності.
- •3. Парадигма модульности (локализации).
- •4. Парадигма атд.
- •5. Парадигма ооп.
- •7. Ефективний доступ до членів класу. Дружні функції та дружні класи.
- •8. Конструкторы и деструкторы.
- •9. Инициализация полей класса. Статические члены класса.
- •10. Наследование классов. Конструкторы базового класса.
- •11. Обмеження доступу до базового класу.
- •12. Множинне наслідування.
- •13. Виртуальные базовые классы.
- •14. Конкретные и абстрактные типы. Виртуальные функции.
- •15. Виртуальные деструкторы и «витруальные» конструкторы. Клонирование.
- •16. Посилання. Ініціалізація, використання, порівняння з покажчиками.
- •17. Перевантаження функцій.
- •18. Перевантаження унарних операцій.
- •19. Перевантаження бінарних операцій.
- •20. Параметризація типів за допомогою шаблонів.
- •21. Параметризація функцій за допомогою шаблонів.
- •22. Перетворення за допомогою конструкторів. Обмеження.
- •23. Перетворення за допомогою перетворюючих функцій.
- •24. Область видимости.
- •25. Пространства имен. Директива using.
- •27. Потоки. Віртуальні операції введення та виведення.
- •29. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
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; }