ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн
Базовый и производный классы
Помните пример COUNTPP3 из главы 8 «Перегрузка операций»? Эта программа использует объект класса Counter как счетчик. Он мог быть инициализирован нулем или некоторым числом при использовании конструктора, увеличен методом operator++() и прочитан с помощью метода get_count().
Предположим, что мы затратили много времени и сил на создание класса Counter и он работает именно так, как мы хотим. Мы вполне довольны результа- том, за исключением одной вещи: нам очень нужен метод для уменьшения счет- чика. Возможно, мы производим подсчет посетителей банка в конкретный мо- мент времени. При входе посетителя счетчик увеличивает свое значение, при выходе — уменьшает.
Мы могли бы вставить метод уменьшения прямо в исходный код класса Counter. Однако существует несколько причин, по которым мы не можем себе этого позволить. Во-первых, класс Counter прекрасно работает, на его отладку затрачена масса времени (конечно, в данном случае это преувеличение, но по- добная ситуация может иметь место для более сложных и больших классов). Если мы вмешаемся в исходный код класса Counter, то его тестирование и от- ладку придется проводить вновь, тратя на это время.
Во-вторых, в некоторых ситуациях мы просто не имеем доступа к исходному коду класса, например, если он распространяется как часть библиотеки классов (мы обсудим это позднее в главе 13 «Многофайловые программы»).
Во избежание этих проблем мы можем использовать наследование для соз- дания классов на базе Counter. Ниже представлен листинг программы COUNTEN, в которой появится новый класс CountDn, добавляющий операцию уменьшения к классу Counter:
// counten.cpp
//inheritance with Counter class
#include <iostream.h>
// using namespace std; // сам изменил
//////////////////////////////////////////////////////////
class Counter //базовый класс
{
protected:
unsigned int count; //счетчик
public:
Counter ( ) : count ( 0 ) //конструктор без аргументов
{ }
Counter ( int c ) : count ( c )
{ }
unsigned int get_count ( ) const
{ return count; } // возвращает значение счетчика
Counter operator++ ( ) //увеличивает значение
//счетчика (префикс)
{ return Counter ( ++count ); }
};
//////////////////////////////////////////////////////////
class CountDn : public Counter//производный класс
{
public:
Counter operator-- ( ) //уменьшает значение счетчика
{ return Counter ( --count ); }
};
//////////////////////////////////////////////////////////
int main ( )
{
CountDn c1; // объект c1
cout << "\n c1=" << c1.get_count ( ); //вывод на печать
++c1; ++c1; ++c1; //увеличиваем c1 три раза
cout << "\n c1=" << c1.get_count ( ); //вывод на печать
--c1; --c1; //уменьшаем c1 два раза
cout << "\n c1=" << c1.get_count ( ); //вывод на печать
cout << endl;
return 0;
}
Программа начинается с описания класса Count, которое не изменилось с мо- мента его первого появления в COUNTPP3 (с одним небольшим исключением, которое мы рассмотрим позднее).
Заметим, что для простоты мы не включаем в эту программу операцию пост- фиксного увеличения, требующую использования вторичной перегрузки опера- ции ++.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42