выполнения тестов, а также адрес тестируемой функции. В строке 15 
вызывается функция-член Report() объекта test для вывода результатов тестов. 
Тестируемая функция (строки 19-25) исключительно для демонстрации вызывает 
функцию sprintfO. Для проведения другого испытания измерения быстродействия 
замените ее держимое функции Testfn() какими-нибудь другими операторами. 
Выполнение программы приводит к вывод следующего отчета: 

    Testing sprintf() function 
    Running 20000 tests... 
    Tests completed 
    Elapsed time == 4.118690 sec. 

    СОВЕТ
		
    Когда вы начинаете писать новую программу, поищите среди классов один или 
несколько таких, которые могут вам пригодиться. Используйте существующие классы 
в качестве базовых для вывода новых классов. К этим новым классам вы можете 
добавить конструкторы, деструкторы, данные-члены и функции-члены так, чтобы
существующие классы могли исполнять ваши приказы. Нельзя сказать, что ООП 
делает программирование проще, но, по крайней мере, вы упрощаете себе работу, 
используя повторно существующий код. 

    Виртуальные функции 

    Назначение виртуальных функций ускользает от понимания большинства 
начинающих программистов на языке C++. Упрощая, можно сказать, что виртуальная 
функция — это функция, вызов которой зависит от типа объекта. В классическом 
программировании вы могли передать объект данных функции, при этом необходимо 
было задать тип объекта в то время, когда вы писали код. В ООП вы можете 
писать виртуальные функции так, чтобы объект определял, какую функцию 
необходимо вызвать, во время выполнения программы. 
    Короче говоря, с помощью виртуальных функций объект определяет свои 
собственные действия. 

    ЗАМЕЧАНИЕ 

    Технику использования виртуальных функций иногда еще называют 
полиморфизмом, намекая на тот факт что объекты с виртуальными функциями, 
кажутся приспосабливающимися к контексту, в котором они используются. В первой 
редакции этой книги, а также во многих системах обучения по ООП использовался 
этот термин, однако он скорее сбивает с толку, чем поясняет что-либо, и в этой 
новой редакции книги используется более описательный термин — виртуальные функции. 
    Для лучшего понимания виртуальных функций сперва ознакомьтесь с важным 
принципом классов C++, связанных отношением наследования. Согласно правилам 
C++ указатель на базовый класс может ссылаться на объект этого класса или на 
объект любого другого класса, производного от базового (рис. 14.10 и 14.11). 

    Указатель на базовый класс может ссылаться на  объект базового класса или 
любого производного класса 
    Объект базового класса 
    Указатель на производный класс может ссылаться на объекты производного 
класса, но не на объекты базового класса 
    Указатель на базовый класс 
    Объект производного класса 
    Объект производного класса I 
    Указатель на производный класс 

    Рис. 14.10. Указатель на базовый клйос может ссылаться на объект 
производного класса

    Понимание этого правила — ключ к пониманию того, как используются 
виртуальные функции. Рассмотрим ряд следующих классов — А, В и С, где В 
выводится из А, а С — из В. В программе объекты классов А, В и С могут 
объявляться с помощью следующих операторов: 

    A aObject;	//	Объявление	объекта	типа А                                    
    В bObject;	//	Объявление	объекта	типа В 
    С cObject:	//	Объявление	объекта	типа С 


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