Віртуальні базові класи
Віртуальні базові класи дають змогу розв’язати проблему, яка виникає при множинному успадковуванні.
Розглянемо таку ситуацію: є базовий клас Parent, два похідні від нього класу Child1 та Child2 і ще четвертий клас GrandChild, породжений одночасно класами Child1 і Child2.
В такому випадку проблеми виникатимуть, якщо метод класу GrandChild захоче дістати доступ до даних чи методів класу Parent. Це продемонстровано в програмі 22.6
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
class Parent
{protected:
int basedata;
};
//////////////
class Child1:public Parent
{ };
/////////////
class Child2:public Parent
{ };
///////////
class GrandChild:public Child1,public Child2
{public:
int getdata()
{return basedata;}//error
};
///////////////
int main()
{clrscr();
bioskey(0);
return 0;
}
Програма 22.6
При спробі прокомпілювати цю програму ми одержуємо повідомлення про помилку. Вона спричинена тим, що кожен з породжених класів Child1 і Child2 успадковує свою копію базового класу Parent. Ця копія називається підоб’єктом. Кожен з двох підоб’єктів містить власну копію даних базового класу, включаючи basedata. Потім, коли GrandChild посилається на basedata, то до якої з двох копій базового класу він здобуває доступ? Ситуація неоднозначна, про що компілятор і повідомляє.
Для усунення неоднозначності зробимо Child1 і Child2 спадкоємцями віртуального базового класу, як показано в програмі 22.7
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
class Parent
{protected:
int basedata;
};
//////////////
class Child1:virtual public Parent // успадковує копію Parent
{ };
/////////////
class Child2:virtual public Parent //успадковує копію Parent
{ };
///////////
class GrandChild:public Child1,public Child2
{public:
int getdata()
{return basedata;}//так можна
};
///////////////
int main()
{clrscr();
bioskey(0);
return 0;
}
Програма 22.7
Використання ключового слова virtual в цих двох класах призводить до того, що вони успадковують єдиний спільний підоб’єкт базового класу Parent. оскільки тепер у нас є тільки одна копія basedata, неоднозначність при звертанні до базового класу усувається.
Необхідність використання віртуального базового класу показує, що при множинному успадкуванні виникає ряд концептуальних проблем, тому такий підхід слід використовувати обережно.
Дата добавления: 2015-08-26; просмотров: 1183;