Главная->Інформатика та програмування->Содержание->Базовый и производный классы

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 (с одним небольшим исключением, которое мы рассмотрим позднее).

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

 

3