Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Замечание. При отладке вашего собственного кода вы можете использовать операторы отображения, подобные тем, что использовались в FRANCH.CPP

Совет

При отладке вашего собственного кода вы можете использовать операторы отображения, подобные тем, что использовались в FRANCH.CPP. отображение сообщений из конструкторов, деструкторов или функций-членов – полезная обратная связь с сложной иерархической организацией классов.

Иерархия классов в FRANCH.CPP на первый взгляд прост. Однако настоящие проблемы с родством классов возникают, когда еще один класс выводится из группы компаний и инвесторов. Предположим, еще одна корпорация приобретает некоторые из компаний-родителей и избранных вкладчиков. Как и в реальном мире корпоративных финансов, сложные взаимосвязи между компаниями и людьми могут легко стать неуправляемыми. Рассмотрим класс Corporation, в котором делается попытка наследования компании McDougles вместе с акционерами Тедом и Алисой:

class Corporation

: public McDougles

public Ted,

public Alice {

public:

….

};

Вернемся назад, к рис. 3.13, и вы удалите, почему версия Corporation никогда не оторвется от земли. (этот код даже не скомпилируется.) Ted и Alice уже частично выведены из McDougles. Попытка сделать то же самое в Corporation, плачевно заканчивается наследованием нескольких базовых классов McDougles. На этом компилятор выдаст вам сообщение о том что “ McDougles is inaccessible because [it is] also in Ted” (McDougles недоступен, поскольку он уже вTed).

Когда вы получите подобное предупреждение в сложном множестве взаимосвязанных классов, попытайтесь идентифицировать те базовые классы, ля которых необходимо только один объект. В случае с Corporation имеет смысл иметь только одну компанию McDougles. Даже несмотря на то, что Ted выводится из McDougles, это тот же McDougles, который пытается наследовать Corporation. В процесс приобретения активов Теда Corporation не определяется с двумя отдельными компаниями-родителями McDougles. Присутствует лишь один такой родитель, имеющий непосредственное отношение к Corporation и косвенное, к ней же, через Ted.

В похожих (однако менее фривольных) ситуациях, когда в классах, наследующих несколько других, требуется только одна копия множественно наследованного базового класса, вы можете одним махом сократить число объектов этого базового класса до одного-единственного, объявив его виртуальным. В иерархии классов существует только одна копия объекта виртуального базового класса даже в том случае, если класс этого объекта наследуется более одного раз.

В листинге 3.9 демонстрируется, как создать класс Corporation, использующий виртуальные базовые классы, и решить проблему размножения базового класса McDougles.

Скомпилируйте CONGLOM как EasyWin-приложение из интегрированной среды, так как в следующем разделе используются средства оболочки для исследования родства между кассами и программе. Если вы скомпилируете программу из командной строки DOS, вы не сможете или воспользоваться.

Листинг 3.9 CONGLOM.CPP (подключение базовых классов)

1: // conglom.cpp

2:

3: #include <iosream.h>

4: #include <string.h>

5:

6: class Company {

7: private:

8: char *name

9: public:

10: Company(const char *s)

11: name = strdup(s);

12: cout << “In constructor for”;

13: Display();

14: }

15: virtual??company() {

16: cout << “In destructor for “;

17: Display();

18: delete name;

19: }

20: void Display(void) {cout << name << ‘\n’; }

21: };

22:

23: class Jennys; public Company {

24: public:

25: Jennys(); Company(”Jenny’s”) {}

26: };

27:

28: class McDougles: public Company {

29: public:

30: McDougles(): Company(“McDougles”) {}

31: };

32:

33: class BurgerQueen: public Company {

34: public:

35: BurgerQueen(): Company(“BurgerQueen”) {}

36: };

37:

38: class Bob

39:: virtual public Jennys

40: virtual public McDougles {

41: };

42:

43: class Ted

44:: virtual public McDougles

45: virtual public BurgerQueen {

46: };

47:

48: class Alice

49:: virtual public Jennys,

50: virtual public McDougles,

51: virtual public BurgerQueen {

52: };

53:

54: class Corporation

55:: virtual public McDougles,

56: public Ted,

57: public Alice {

58: private:

59: char *name;

60: public:

61: Corporation(): McDougles(), Ted(), Alice()

62: {name = “Conglomerate Industries”; }

63: void Display(void) { cout << name << ’\n’; }

64: };

65:

66: main()

67: {

68: cout << “\nForming a corporation\n”;

69: corporation *cp;

70: cp = new corporation;

71: cp->Display();

72: delete cp;

73: return 0;

74: }

Класс Company не изменился, в то время как в Jennys, McDougles, BurgerQueen, Bob, Ted и Alice, конечно, потребовались изменения для предупреждения в будущем наследования нескольких копий их базового класса-родителя. Например, Bob теперь объявлен следующим образом:

class Bob

: virtual public Jennys

virtual public McDougles {

};

Добавление ключевого слова virtual к перечисленным базовым классам указывает компилятору, что в последующих выводах классов, также наследующих Jennys или McDougles, должна существовать только одна копия этих двух базовых классов. Аналогично, в классах Ted и Alice (строки 53-52),базовые класса указаны виртуальными.

Теперь можно спроектировать класс Corporation (54-64). Как и ранее, класс наследует базовые классы McDougles, Ted и Alice. Конечно, с объявлением McDougles виртуальным базовым классом в итоге будет существовать только одна копия класса Corporation, не смотря на то, что Ted и Alice также выведены из класса McDougles.

Ted и Alice также могли бы быть объявлены виртуальными базовыми классами в строках 56-57, это было бы необходимо только в том случае, если бы в последующих выводах из класса Corporation также наследовались бы и эти классы.

<== предыдущая лекция | следующая лекция ==>
Замечание. Предположим, класс зависит от того, в каком порядке будут проинициализированы его компоненты | Время: - 2 часа
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 305; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.