                                                            Jennys	)          I            «Ob		) 
    
    
    I        Company	)	[      McDougles	]	Те,	) 
    
    
                                                       i     BurgerQueen	1	Alice	) 

РиС-14-13- Иерархия классов в программе FRANCH.CPP

    На рис. 14.13 иллюстрируется родословная классов FRANCH.CPP. В корне 
иерархии — класс Company, служащий базовым для трех производных 
классов — Jennys, McDouglas и BurgerQueen. Каждая из этих "компаний"-классов 
выводится из класса Comрапу, и, следовательно, каждый класс наследует член
name (строка 8), а также функцию-член Display() (строка 20).
    Три предприимчивых инвестора, Боб, Тед и Алиса, объявлены классами (строки 
38-52). Класс Bob строит свою кулинарную империю из двух классов Company — 
Jennys и McDougles. Класс Ted делает себе состояние на McDougles и 
BurgerQueen. Alice, самая честолюбивая душа из троицы, вкладывает средства 
сразу в три класса Company — Jennys, McDougles и BurgerQueen. Когда вы 
запустите программу, то увидите сообщения, рапортующие, какие конструкторы и 
деструкторы и когда были запущены, как они инициализировали и очищали три 
объекта классов, по одному на каждого вкладчика (строки 56-58). 

     СОВЕТ

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

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

    class Corporation 
         public McDougles,	// ??? 
         public Ted, 
         public Alice {       
    public: 
         ..........
    };

    Вернемся назад, к рис. 14.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. 
    В похожих (однако менее фривольных) ситуациях, когда в классах, 
наследующих несколько других, требуется только одна копия множественно 
наследованного базового класса, вы можете одним махом сократить 
число объектов этого базового класса до одного-единственного, объявив его 
виртуальным. В иерархии классов ствует только одна копия объекта виртуального 
базового класса даже в том случае, если класс этого объекта наследуется более 
одного раза. 
    В листинге 14.9 демонстрируется, как создать класс Corporation, 
использующий виртуальные базовые классы, и решить проблему размножения 
базового класса McDougles. 
    Скомпилируйте CONGLOM как Easy Win-приложение из интегрированной среды, 
так как в следующем разделе используются средства оболочки для исследования 
родства между классами в программе. Если вы компилируете программу из 
командной строки DOS, вы не сможете ими воспользоваться. 

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

    1:	// conglom.cpp 
    2: 
    3:	#include <iostream.h>                         
    4: 	#include <string.h>
    5:	                            
    6:	class Company {                                               
    

   Глава 14. Объектно-ориентированное программирование 363 
