ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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.
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