Множинне успадкування
Якщо у похідного класу є декілька базових класів, то говорять про множинне успадкування. Множинне успадкування дозволяє поєднувати в одному похідному класі властивості та поведінку декількох класів.
Наступний приклад демонструє множинне успадкування.
#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
Цей приклад наглядно демонструє, що конструктори базових класів викликаються в порядку їх оголошення. Деструктори викликаються в оберненому порядку.