    Конечно, вы не обязаны реализовать конструкторы производных классов 
встраиваемыми и можете также объявить TDerived() следующим образом: 

    сlass TDerived:  public TBase {	4 
    public: 
      TDerived();	// Конструктор производного класса 
      void ChangeCount(int n)  { Set?ount(GetCount() + n);   } 
    }

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

   TDеrived::TDerived()  // Заголовок конструктора
      :  TBase()    // Вызов конструктора базового класса 
    {
       // В этом месте выполняются операторы конструктора 
    }

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

    Использование функций-членов производного класса 

    Производный класс наследует count из базового класса.  Конечно, поскольку 
count закрыт в TBase, в TDerived нельзя получить к нему непосредственный доступ. 
Только члены класса могут иметь доступ к закрытым членам этого же класса. 
Конечно, в TDerived можно объявить свои собственные закрытые члены. Напри-   
мер, рассмотрим класс, объявленный следующим образом: 

    class TDerived:  public TBase { 
    private: 
      int secondCount; 
   public: 
    TDerived();     // Конструктор производного класса	
    void ChangeCount(int n) { SetCount(GetCount() + n); }       

  TDerived наследует свойства TBase, включая закрытый член базового класса count. 
В новом классе добавился новый закрытый член secondCount. Для того чтобы его 
инициализировать, новый конструктор можно реалиэовать следующим образом: 

    TDerived::TDerived ()  // Заголовок конструктора
    :  TBase()     // Инициализация данных-членов TBase 
    {  
       secondCount = 0;     // Инициализация данных-членов TDerived 
    } 
     

    Вызов конструктора TBase() инициализирует объект класса TBase. Оператор 
присваивания члену  secondCount в конструкторе производного класса 
инициализирует объект класса TDerived. Конструктор базового класса должен 
вызываться первым, что обеспечит инициализацию всех наследуемых членов до 
того, как будут инициализированы члены производного класса. Рис. 14.5 
демонстрирует родственные взаимосвязи между классами TBase и Tderived. 
    В новом классе TDerived также объявлена открытая функция-член ChangeCount 
для увеличения и уменьшения значения члена count, наследованного из класса 
TBase. Конечно, поскольку count закрыт в классе TBase, в функции 
ChangeCount() нельзя получить непосредственный доступ к этому члену. Вы не 
можете написать функцию-член ChangeCount() следующим образом: 

    void ChangeCount(int n)  { count += n;   }	// ???                             

    Этот оператор вызовет сообщение об ошибке при компиляции, поскольку член 
count закрыт в базовом классе, и только члены TBase могут иметь непосредственный 
доступ к count. Для изменения члена count,  функция-член ChangeCountO может вызвать 
незакрытые наследуемые функции-члены, подобные SetCount()  и GetCount(): 

    void ChangeCount(int n) { SetCount(GetCount() + n);   } 


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