ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн

Перегрузка функций

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

Рассмотрим пример, основанный на программе STAKARAY из главы 7 «Масси- вы и строки». Эта программа моделировала стек, простое устройство хранения данных. Она позволяла помещать числа в стек, а затем извлекать их. При по- пытке отправить в стек слишком много чисел программа могла зависнуть по

причине переполнения массива st [ ]. А при попытке извлечения количества чисел, большего, чем находится в стеке, результат мог быть бессмысленным, так как начинали считываться данные, расположенные в памяти за пределами массива.

Для исправления этих дефектов мы создадим новый класс Stack2, производ- ный от Stack. Объекты класса Stack2 ведут себя так же, как объекты класса Stack, за исключением того, что мы будем предупреждать о попытке переполнить стек или извлечь число из пустого стека. Вот листинг программы STAKEN:

// staken.cpp

// перегрузка функций базового и производного классов

#include <iostream>

using namespace std;

#include <process.h>      // для exit ( )

///////////////////////////////////////////////////////////

class Stack

{

  protected:              // Замечание: использовать private нельзя

    enum { MAX = 3 };     // размер стека

    int st[ MAX ];        // данные, хранящиеся в стеке

    int top;              // индекс последнего элемента в стеке

  public:

    Stack ( )            // конструктор

      { top = -1; }

    void push ( int var ) // помещение числа в стек

      { st[ ++top ] = var; }

    int pop ( )           // извлечение числа из стека

      { return st[ top-- ]; }

};

///////////////////////////////////////////////////////////

class Stack2 : public Stack

{

  public:

    void push ( int var )      // помещение числа в стек

      {

        if( top >= MAX-1 )     // если стек полон, то ошибка

          { cout << "\nОшибка: стек полон"; exit ( 1 ); }

        Stack::push ( var );   // вызов функции push класса Stack

      }

    int pop ( )                // извлечение числа из стека

      {

        if ( top < 0 )         // если стек пуст, то ошибка

          { cout << "\nОшибка: стек пуст\n"; exit ( 1 ); }

        return Stack::pop ( ); // вызов функции pop класса Stack(можно без return)

      }

};

///////////////////////////////////////////////////////////

int main ( )

{

  Stack2 s1;

 

  s1.push ( 11 ); // поместим в стек несколько чисел

  s1.push ( 22 );

  s1.push ( 33 );

 

  cout << endl << s1.pop ( ); // заберем числа из стека

  cout << endl << s1.pop ( );

  cout << endl << s1.pop ( );

  cout << endl << s1.pop ( ); // ой, а данных-то больше нет

  cout << endl;

  return 0;

}

В этой программе класс Stack тот же, что и в программе STAKARAY, за исклю- чением того, что данные класса объявлены как protected.

 

13