Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

Void Spouse(Person &p)

{

++p.secret;

cout << p.secret;

}

Void main()

{

Person ff;

Spouse(ff);

}

У даному прикладі функція Spouse() є звичайною функцією і не належить жодному класу. Цій функції передається посилання на об'єкт класу Person.

Приклад:

class monstr; // Попереднє оголошення класу

class hero

{

public:

void kill(monstr &);

}

class monstr

{

friend int steal_ammo(monstr &);

friend void hero:: kill(monstr &);

// Клас hero має бути визначений раніше

};

int steal_ammo(monstr &M){return --M.ammo;}

void hero::kill(monstr &M){M.health = 0; M.ammo = 0;}

У даному прикладі приведений опис двох функцій, дружніх класу monstr. Функція kill є методом класу hero, а функція steal_ammo не належить жодному класу.

Використання дружніх функцій потрібно по можливості уникати, оскільки вони порушують принцип інкапсуляції і, таким чином, ускладнюють відлагодження та модифікацію програми.

2.4.2 Дружній клас

Якщо всі методи якого-небудь класу повинні мати доступ до прихованих полів іншого, весь клас оголошується дружнім за допомогою ключового слова friend. У приведеному нижче прикладі клас mist оголошується дружнім класу hero:

class hero

{

friend class mist;

};

class mist

{

void fl();

void f2();

};

Функції f1() і f2() є дружніми по відношенню до класу hero (хоча і описані без ключового слова friend) і мають доступ до всіх його полів. Оголошення friend не є специфікатором доступу і не успадковується.

Завдання

Даний розділ тісно пов’язаний з динамічними структурами даних де розглядаються вкладені класи. Варіанти завдань треба виконати з використанням вкладених класів.

Розділ 3. Спадкування класів

3.1 Спадкування класів

Механізм спадкування класів дозволяє будувати ієрархії, в яких похідні класи отримують елементи батьківських, або базових, класів і можуть доповнювати їх або змінювати їх властивості. При великій кількості ніяк не зв'язаних класів управляти ними стає неможливо. Спадкування дозволяє впоратися з цією проблемою шляхом впорядковування і ранжирування класів, тобто об'єднання загальних для декількох класів властивостей в одному класі і використання його як базового. Класи, що знаходяться ближче до початку ієрархії, об'єднують в собі найбільш загальні риси для всіх класів, що знаходяться нижче. У міру просування вниз за ієрархією класи набувають все більше конкретних рис. Множинне спадкування дозволяє одному класу володіти властивостями двох та більше батьківських класів.

При описі класу в його заголовку перераховуються всі класи, що є для нього базовими. Можливість звернення до елементів цих класів регулюється за допомогою ключів доступу private, protected і public:

class ім'я : [private | protected | public] базовий_клас

{ тіло класу };

Якщо базових класів декілька, вони перераховуються через кому. Ключ доступу може стояти перед кожним класом, наприклад:

class А { ... };

class В { ... };

class С { ... };

class D: А, protected В, public С { ... };

За умовчанням для класів використовується ключ доступу private, а для структур – public. До цих пір ми в основному розглядали специфікатори доступу private і public. Для будь-якого елементу класу може також використовуватися специфікатор protected, який для одиночних класів, що не входять в ієрархію, рівносильний private. Різниця між ними виявляється при спадкуванні, що можна бачити з приведеної таблиці:

Як видно з таблиці, private елементи базового класу в похідному класі недоступні незалежно від ключа. Звернення до них може здійснюватися тільки через методи базового класу. Елементи protected при спадкоємстві з ключем private стають в похідному класі private, в решті випадків права доступу до них не змінюються.

Ключ доступу

Специфікатор у базовому класі

Доступ в похідному класі

private

private

немає

protected

private

public

private

protected

private

немає

protected

protected

public

protected

public

private

немає

protected

protected

public

public

Доступ до елементів public при спадкуванні стає відповідним ключу доступу. Якщо базовий клас успадковується з ключем private, можна вибірково зробити деякі його елементи доступними в похідному класі, оголосивши їх в секції public похідного класу за допомогою операції доступу до зони видимості:

class Base

{

public: void f();

};

class Derived : private Base

{

public:

Base::void f ();

};

Як правило, похідний клас оголошується зі специфікатором доступу базового класу public.

Приклад.

class A

{

int a;

protected:

void aa(int u) {a = u;}

};

class B: public A

{

int b;

public:

void bb(int u);

};