ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. Но если возникнет необходимость в доступе, то его всегда можно будет осуществить.
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
Схожі підручники
- Теорія Ймовірності основні теми
- Загальні питання з курсу Безпека життєдіяльності №1
- Методичні вказівки до виконання практичного заняття на тему «Післяоптимізаційний аналіз розв’язку економічних задач »
- Загальні терміни з курсу «Філософія»
- Мікро економіка. Супровід лекцій
- Цивільна оборона (частина 2)