    Класс TBase имеет один защищенный член — указатель basep на строку 
символов. Конструктор класса вызывает библиотечную функцию strdupO для 
создания копии строкового аргумента в виде динамической переменной с 
присвоением адреса выделенной памяти указателю basep. Деструктор -TBaseO 
освобождает этот блок памяти, когда объект типа TBase выходит из 
области видимости. При создании объекта типа: 

    TBase  president("George Washington"); 

    Коснтруктору класса передается строка "George Washington", при этом он 
создает копию строки и присваивает ее адрес члену basep объекта president. Для 
отображения строки, хранящейся в president, вы можете написать: 

    cout « president.GetStr() ; 

    Когда president выходит из области видимости, деструктор класса удаляет 
строку, хранящуюся в куче. Рис. 14.7 иллюстрирует представление president в памяти. 


    Строка,	хранящаяся	в куче 
    Объект president класса TBase 
    char *basep 
    Другие члены класса 
    э*Ч 
    Указатель — член объекта ссылается на строку, хранящуюся в куче 
    Jnw 

    Рис. 14.7. Представление объекта типа TBase в памяти 


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

    class TDerived:  public TBase { 
    private: 
       char *uppercasep; 
    public: 
       TDerived(const char *s); "TDerivedO  { delete uppercase?;   } 
       const char GetUStr(void)  {  return uppercasep;   } ; 

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

    TDerived::TDerived(const char *s) 
        :  TBase(s)   // Вызов конструктора базового класса uppercasep 
    {
          strupr(strdup(s));         // Инициализация данных TDerived 
    }

    Конструктор TDerived вызывает конструктор TBase, копирующий строку, на 
которую ссылается s, в кучу и инициализирующий указатель basep адресом копии 
строки. По завершении этой операции конструктор производного класса создает 
еще одну копию строки, преобразуя ее символы в прописные буквы путем обращения 
к библиотечной функции struprO, и присваивает uppercasep адрес этой копии строки. 
    Если вы создаете объект типа TDerived, значит вы создаете две копии 
строки: одну неизмененную и одну, символы которой преобразованы в прописные. 
Вы можете использовать объявление 

    TDerived president!"George Washington"); 

и затем выполнить следующие операторы: 

    cout « "Original string:   " « president.GetStr() « '\n'; 
    cout « "Uppercase string:  " « president.GetUStrO « '\n': 

    Первый оператор вывода отображает первоначальную неизмененную копию строки 
"George Washington". Второй — копию этой же строки, все буквы которой преобразованы 
в прописные, инициализированную конструктором производного класса: 

    Original string:  George Washington	
    Uppercase string:  GEORGE WASHINGTON


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