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

Множинне успадкування

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

Наступний приклад демонструє множинне успадкування.

#include <iostream.h>

#include <conio.h>

#include <string.h>

class Coord

{

int x, y;

public:

Coord(int_x, int_y){x=_x; y=_y;}

int GetX(){return x;}

int GetY(){return y;}

void SetX(int_x){x=_x;}

void SetY(int_y){y=_y;}

};

class SaveMsg

{

char Message[80];

public:

SaveMsg(char* msg){SetMsg(msg);}

void SetMsg(char* msg)

{strcpy(Message, msg);}

void ShowMsg(){cout<< Message;}

};

class PrintMsg: public Coord, public SaveMsg

{

public:

PrintMsg(int_x, int_y, char* msg):

Coord(_x, _y),SaveMsg(msg){}

void Show();

};

void

PrintMsg:: Show()

{

Gotoxy(GetX(),GetY());

ShowMsg();

}

main()

{

PrintMsg* ptr;

ptr=new PrintMsg(10, 5, “Множинне”);

ptr->Show();

ptr->SetX(25);

ptr->SetY(5);

ptr->SetMsg(“успадкування”);

ptr->Show();

delete ptr;

return 0;

}

В цьому прикладі клас Coord відповідає за збереження та встановлення значень координат на екрані, клас SaveMsg зберігає та встановлює повідомлення, а клас PrintMsg, який є похідним від них, виводить це повідомлення на екран в заданих координатах. Цей приклад демонструє також, як відбувається передача параметрів конструкторам базових класів. При множинному успадкуванні, як і при простому, конструктори базових класів викликаються компілятором до виклику конструктора похідного класу. Єдина можливість передати їм аргументи – використати список ініціалізації елементів. Причому порядок оголошення базових класів при успадкуванні визначає і порядок виклику їх конструкторів, якому повинен відповідати порядок послідовності конструкторів базових класів у списку ініціалізації. У даному випадку клас PrintMsg містить таке оголошення про успадкування:

class PrintMsg: public Coord, public SaveMsg

Цьому оголошенню відповідає наступний конструктор:

PrintMsg(int_x, int_y, char* msg):

Coord(_x, _y), SaveMsg(msg){}

В основній програмі цьому конструктору передаються аргументи при створенні об’єкта класу PrintMsg за допомогою оператора new:

ptr=new PrintMsg(10, 5, “Множинне”);

Виконання функції-члена Show() приводить до виводу на екран у вказаних координатах повідомлення, яке задане третім аргументом.

Наступні за цим виклики функцій-членів SetX(), SetY() і SetMsg() приводять до встановлення нових значень координат і нового повідомлення, яке виводиться повторним викликом функції Show().

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

#include <iostream.h>

class Base1

{

public:

Base1(){cout<<”Ми в конструкторі Base1\n”;}

~ Base1(){cout<<”Ми в деструкторі Base1\n”;}

};

class Base2

{

public:

Base2(){cout<<”Ми в конструкторі Base2\n”;}

~ Base2(){cout<<”Ми в деструкторі Base2\n”;}

};

Class Derived: public Base1, public Base2

{

public:

Derived()

{

cout<<<<”Ми в конструкторі Derived\n”;

}

~ Derived()

{

cout<<”Ми в деструкторі Derived\n”;

}

};

main()

{

Derived ob;

return 0;

}

Ця програма виводить на екран наступне:

Ми в конструкторі Base1

Ми в конструкторі Base2

Ми в конструкторі Derived

Ми в деструкторі Derived

Ми в деструкторі Base2

Ми в деструкторі Base1

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