    SetCount() присваивает count новое значение. Функция-член GetCount()
возвращает текущее значение count. Для упрощения кода конструктор TBase и две 
функции должны быть встраиваемыми, не требующими отдельной реализации. 
    Предположим, вам необходим новый класс, имеющий все свойства TBase, но, 
кроме того, способный увеличивать и уменьшать значение объекта на заданную 
величину. Вы можете переписать первоначальный класс, но это не всегда 
приемлемо в больших проектах, особенно если в работе над ними задействовано 
много программистов. Подобные изменения могут оказаться даже невозможными, 
если TBase — часть коммерческой библиотеки классов, исходные тексты которой 
недоступны. Вместо изменения TBase, можно вывести из него новый класс, 
дополнительно имеющий новые, необходимые вам свойства: 

    class TDerived:   public TBase { 
    public:	
      TDerived():  TBase() { }	
      void ChangeCount( int n )  { SetCount(GetCount() + n);   }. 
    }
 
    Производный класс назван TDerived. Сразу за именем класса следует 
двоеточие и одно из ключевых слов — public, protected или private. После этих 
элементов следует имя базового класса (TBase), от которого TDerived получгет 
наследство. На рис. 14.4 иллюстрируется структура класса TDerived и его конструктора. 

    Может быть открытым, закрытым или защищенным 
    Имя производного класса 
    Базовый класс; предок класса TDerived 
    class TDerived: public TBase { public: TDerivedO : TBaseQ { }_ 
    Конструктор по умолчанию для производного класса 
    Производные классы должны вызывать конструкторы своих базовых классов 
    В этом месте могут выполняться операторы. Этот конструктор не производит 
никаких действий, поэтому не содержит операторов 

    .	Рис. 14.4. Структура производного класса 

    Открытые члены открытого класса остаются открытыми в производном классе. 
Вы можете объявить производный класс следующим образом: 

      class TDerived:   public TBase { 

    В этом случае все открытые члены TBase становятся открытыми членами в 
TDerived. Все закрытые члены TBase остаются закрытыми в своем первоначально 
объявленном классе, и в TDerived нельзя получить доступ к этим членам TBase. 
Вы также можете объявить базовый класс закрытым: 

    class TDerived:   private TBase { 

    В данном случае все открытые члены TBase становятся закрытыми членами в 
TDerived. Последующие наследования TDerived не смогут получить доступ к любым 
членам TBase. Позже вы ознакомитесь с третьим типом спецификатора класса — protected. 

    Использование конструкторов производного класса 

    Ознакомимся подробнее с конструктором класса TDerive — TDerive(). Обычно, в 
производном классе имеется конструктор, если он есть и в базовом классе. Кроме 
того, конструктор производного класса должен вызывать конструктор базового 
класса. (C++ может автоматически вставлять конструкторы и деструкторы по 
умолчанию, а также вызывать их, когда это необходимо для многих классов.) В 
TDerived в строке 

    TDerived():   TBase()  {   }	

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

    Tderived():  TBase()  { cout « "I am being initialized\n";   }  

    338     Часть III. Программирование на ANSI C++ 
