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

Void b::bb(int u)

{

b = u;

aa(u); //використання захищеного члена-функції

}

Аргументи, передані в базовий клас.

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

Приклад передачі параметрів.

сlass A

{

int a, b, c;

public:

A(int x, int y, int z) (a = x; b = y; c = z;)

};

class B:public A

{

int val;

public:

B(int d):A(d, d+1, d+5) {val = d;}

B(int d, int e);

};

B::B(int d, int e):A(d, e, 13)

{

val = d + e;

}

Будь-які аргументи, передані в базовий клас, потрібно визначити до того, як виконується тіло конструктора, оскільки параметри передаються конструктору базового класу до того, як виконається конструктор похідного класу. Тут сказано потрібно, а не повинно. Якщо ви дійсно хочете передавати ініціалізовані параметри базовому класу, то не використовуйте їх доти, поки не проініціалізуєте.

Приклад передачі неініціалізованих параметрів базовому класу.

class Next

{

public:

char* string;

Next(char * cp){string = cp;}

};

class Last:public Next

{

int val; char name[30];

public:

Last(int d);

};

// виклик базового класу з нульовою вказівкою

Last::Last(int d):Next((char *) 0)

{

sprintf(name, "%d", d);

//ініціалізуєтся змінна базового класу

string = name;

val = d;

}

При створенні екземпляра класу викликається його конструктор. Якщо клас є похідним, то повинен бути викликаний конструктор базового класу. Спочатку будується базовий клас, потім похідний.

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

Рис. 3.1 Дерево спадкування

class First {...};

class Second: public First {... };

class: Third: public Second {... };

При створенні екземпляра класу Third конструктори викликаються в такому порядку:

First:: First();

Second:: Second();

Third:: Third();

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

Third:: ~Third();

Second:: ~Second();

First:: ~First();

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

Приклад двох класів, що мають загальні параметри:

#include <iostream>

using namespace std;

class A

{

int color;

int width, height;

public:

A(int, int, int);

int GetColor() {return color;}

int GetWidth() {return width;}

int GetHeight() {return height;}

};

A::A(int c, int w, int h)

{

color = c;

width = w;

height = h;

}

class B: public A

{

int shel;

public:

B(int, int, int, int);

int GetShel() {return shel;}

};

class C: public A

{

int drawers, mater;

public:

C(int, int, int, int,int);

int GetDrawers() {return drawers;}

int GetMater() {return mater;}

};

B::B(int c, int w, int h, int s): A(c, w, h)

{shel = s;}

C::C(int c, int w, int h, int d, int m): A(c, w, h)

{drawers = d; mater = m;}