    Открытые и защищенные члены базового класса наследуются производным 
классом и доступны в нем. Закрытые члены базового класса остаются закрытыми в 
базовом и недоступны в производном классе. В производных классах базовые 
классы могут быть объявлены открытыми, защищенными или закрытыми. С помощью 
спецификаторов доступа (public, protected и private) можно изменить статус 
доступа наследуемых членов. 

    Можно выборочно квалифицировать статус доступа наследуемых членов. 
Например, если в производном классе объявляется закрытым базовый класс, все 
его члены становятся закрытыми в производном классе. Конечно, можно выборочно 
квалифицировать наследуемые члены так, чтобы их статус доступа остался первоначальным. 

    Производные классы обычно снабжаются деструктором, если в этих классах 
объявляются, данные-члены, подлежащие уничтожению при выходе объекта 
производного класса из области действия. Конечно, деструкторы могут выполнять 
и другие действия по очистке объекта. C++ автоматически вызывает деструкторы 
(а также конструкторы по умолчанию) класса, когда это необходимо. 

    Конструкторы базовых классов вызываются перед конструкторами классов, 
выведенных из этих базовых классов. Деструкторы вызываются в обратном порядке 
— деструктор производного класса вызывается перед деструктором базового 
класса. Объекты производных классов создаются в порядке от базового класса к 
производному и уничтожаются — от производного к базовому классу. 

    В производных классах могут замещаться функции-члены, наследуемые из 
базового класса. Такие функции-члены имеют имена, совпадающие с именами 
наследуемых функций, и могут обладать таким же или отличающимся набором параметров. 

    Указатель на базовый класс может ссылаться на объект этого же класса или 
на объект любого производного класса, выведенного из этого базового класса. С 
помощью подобных указателей в операторах могут вызываться виртуальные 
функции-члены, подключающиеся во время выполнения программы в зависимости от 
действительного типа объекта, адресуемого указателем. 

    Деструкторы и функции-члены могут быть виртуальными, в отличие от 
конструкторов. C++ компонует виртуальные функции-члены и виртуальные 
деструкторы во время выполнения программы. Объявления чистых виртуальных 
функций-членов должны заканчиваться = 0. Любой класс, содержащий хотя бы одну 
чистую виртуальную функцию, называется абстрактным. Вы не можете создавать 
объекты абстрактного класса. Предполагается, что в производном классе, 
наследующем абстрактный, будут запрограммированы все чистые виртуальные 
функции-члены абстрактного класса. 

    Множественное наследование может привести к усложненной иерархии классов. 
Одна из самых часто возникающих здесь проблем — наследование производным 
классом большого числа копий отдаленных базовых классов. Для решения этой 
проблемы можно объявить такой базовый класс виртуальным, сведя количество 
копий базовых классов, существующих в объектах производных классов, к одной. 

    Упражнения 

    14.1. Напишите ряд связанных между собой классов для программы, вводящей 
данные с экрана, наподобие базы данных, содержащей имена и адреса. Создайте 
обобщенные классы, запрашивающие и возвращающие значения различных типов 
данных в заданном участке экрана. (Цель данного упражнения — самостоятельное 
составление иерархии классов. В вашем ответе не обязательно читать и писать 
информацию в дисковые файлы.) 
    14.2. Выведите новый класс из класса TBench (листинги 14.1 и 14.2), 
выполняющий серию тестов с заданным числом повторений и сообщающий среднее 
затраченное время для всех тестов. 
    14.3. Разработайте и протестируйте класс, способный сохранять множество 
целых значений от 0 до 15, с использованием одного бита для одного значения. В 
классе должны быть функции-члены, добавляющие, удаляющие, извлекающие и 
отображающие значения в множестве. Используйте виртуальные функции-члены, 
конструкторы и деструкторы там, где это понадобится. В классе должно 
отображаться двоичное значение, подобное 0100100011001011, где 1 означает 
наличие элемента в множестве. 
    14.4. Разработайте класс, способный запомнит^ список объектов незаданного 
типа класса. 
    14.5. На основе выполненного упражнения 14.4 напишите программу, способную 
запоминать и отображать содержимое каталога диска в виде списка строковых объектов. 
    14.6. На основе классов, разработанных в ответе на упражнение 14.5, 
напишите, используя множественное наследование, новый класс, способный 
отображать содержимое каталога и запоминать строку, содержащую спецсимволы. 
Например, инициализация нового объекта-каталога строкой "*.СРР" приведет к 
отображению всех файлов с расширением .СРР, находящихся в'текущем каталоге, и 
к запоминанию самой этой строки для будущих ссылок. 
    

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