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

Int large;

static int small;};

class B

{private:

Int bigwant;

static int count;

public:

B(void)

{bigwant=25;}};

class C

{private:

B b;}

class D

{private:

static int size;

static A an A;

static B a B;

static C a C;//помилка

public:

D(void){ }};

У випадку, коли оголошені статичний елемент або статичне поле в розділі public, доступ можливий i через ".".

Статичні функції-члени можуть виконувати будь-які оператори, однак вони не отримують покажчик this і не мають доступу до жодних полів даних і функцій-членів класу (за винятком статичних). Для виклику статичної функції може використовуватись як об'єкт, так і ім'я класу:

Tanyclass::staticfunction();

Статична функція-член виконує дії, що стосуються всіх об’єктів даного класу.

Цікаві ситуації виникають, якщо розглядати локальнi та глобальнi об'єкти. Розглянемо такий приклад:

Timer t1(5);

Void f() {

static Timer t2(200);}

main()

{f();}

У прикладі конструктор викличеться двічі: спочатку для глобального об'єкта, а потім при виклику функції f(). А якщо у функції main() не викликається функція f()? Чи викликається конструктор для локального статичного об'єкта, якщо функція, де він описаний, не викликається? Відповідь на ці запитання залежить від версії компілятора (напр., для Visual С++ 6.0 конструктор не викликається).

Для глобальних статичних об'єктів конструктори викликаються в тому порядку, у якому вони описані в програмі, деструктори – у зворотному. Причому параметри конструкторів для статичних об'єктів мають бути константними виразами. В останніх версіях компіляторів С++ фірми Microsoft допускається використання не константних виразів, а параметрів:

Void g(int a)

{static Timer t(a);}

7.9. Успадкування

Успадкування є потужним апаратом ООП. Пригадаємо, що успадкування полягає у здатності похідного класу успадковувати властивості базового, набуваючи при цьому своїх специфічних властивостей. За допомогою успадкування можна утворювати нові класи, використовуючи вже існуючі. Замість того, щоб писати код "із чистої сторінки" на базі існуючої ієрархії класів, можна побудувати нові класи, що змінюють властивості існуючих. Це дає величезну перевагу у часі, робить надзвичайно гнучким програмне забезпечення.

7.9.1. Синтаксична реалізація успадкування

Синтаксично успадкування реалізується таким чином:

<ключове слово><ім’я похідного класу>:<базовий список>

{<поля даних>

<функції-члени>}

<ключове слово> – це class, struct чи union;

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

class Base{

private:

type data1;

type function1;

protected:

type data2;

type function2;

public:

type data3;

type function3;}

class PublicPohid: public Base

{private:

type data4;

type function4;

protected:

type data5;

type function;

public:

type data6;

type function6;}

class PrivatePohid: public Base

{private:

type data7;

type function7;

protected:

type data8;

type function8;

public:

type data9;

type function9;}

class ProtectedPohid: public Base

{private:

type data10;

type function10;

protected:

type data11;

type function11;

public:

type data12;

type function12;}

main()

{Base aBase;

PublicPohid aPub;

PrivatePohid bPub;

ProtectedPohid aPro;}