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

Наследование в классе Distance

Мы рассмотрим более сложный пример использования наследования. До сих пор в примерах этой книги, использующих класс Distance, предполагалось, что интервал может иметь только положительное значение. Обычно это использует- ся в архитектуре. Однако, если мы будем измерять уровень Тихого океана с уче- том его приливов и отливов, то нам может понадобиться отрицательное значение интервала. (Если уровень прилива меньше уровня моря, то он называется отри- цательным приливом; он дает сборщикам моллюсков большее пространство об- наженного пляжа.)

Давайте создадим новый производный класс от класса Distance. В этот класс мы добавим поле для наших измерений, которое содержит знак: отрицательный или положительный. А также нам нужно будет изменить методы класса, чтобы они могли работать со знаковым значением интервала. Приведем листинг про- граммы ENGLEN:

// englen.cpp

// наследование в программе перевода английских мер длины

#include <iostream>

using namespace std;

enum posneg { pos, neg };

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

class Distance // класс для английских мер длины

{

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

    int feet;

    float inches;

  public:

    // конструктор без параметров

    Distance ( ) : feet ( 0 ), inches ( 0.0 )

      { }

    // конструктор с двумя параметрами

    Distance ( int ft, float in ) : feet ( ft ), inches ( in )

      { }

    // получение значений от пользователя

    void getdist ( )

      {

        cout << "\nВведите футы: "; cin >> feet;

        cout << "Введите дюймы: "; cin >> inches;

      }

    // вывод значений на экран

    void showdist ( )  const

      { cout << feet << "\'-" << inches << '\"'; }

};

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

 

class DistSign : public Distance // добавление знака к длине

{

private:

    posneg sign;                 // значение может быть pos или neg

public:

    // конструктор без параметров

    DistSign ( ) : Distance ( )

                { sign = pos; }

    // конструктор с двумя или тремя параметрами

    DistSign ( int ft, float in, posneg sg = pos ) :

                Distance ( ft, in )      // вызов конструктора базового класса

                { sign = sg; }           // начальная установка знака

    void getdist ( )           // ввод пользователем длины

                {

        Distance::getdist ( ); // вызов функции getdist из базового класса

        char ch;               // запрос знака

        cout << "Введите знак (+ или -): "; cin >> ch;

        sign = ( ch == '+' ) ? pos : neg;

                }

    void showdist ( ) const    // вывод расстояния

                {

        // вывод всей информации, включая знак

        cout << ( ( sign == pos ) ? "(+)" : "(-)" );

        Distance::showdist ( );

                }

};

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

int main ( )

{

                DistSign alpha;                   // используем конструктор по умолчанию

                alpha.getdist ( );                // получаем данные от пользователя

               

                DistSign beta ( 11, 6.25 );       // конструктор с двумя аргументами

               

                DistSign gamma ( 100, 5.5, neg ); // конструктор с тремя аргументами

               

                // выводим данные для всех переменных

                cout << "\nA = "; alpha.showdist ( );

                cout << "\nB = "; beta.showdist ( );

                cout << "\nC = "; gamma.showdist ( );

                cout << endl;

                return 0;

}

 

Здесь мы видим класс DistSign, в который добавлена возможность работы со знаковыми числами. Класс Distance в этой программе тот же, что и в предыду- щих, за исключением того, что его данные объявлены как protected. Фактически, в этом случае спецификатор мог быть private, так как нет методов производного класса, нуждающихся в доступе к данным класса Distance. Но если возникнет необходимость в доступе, то его всегда можно будет осуществить.

 

16