КАТЕГОРИИ: Архитектура-(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 также наследовались бы и эти классы.
Дата добавления: 2014-01-11; Просмотров: 305; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |