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

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

Конструкторы при множественном наследовании

Программа EMPMULT не имеет конструкторов. Рассмотрим пример, показыва- ющий, как работают конструкторы при множественном наследовании.

Представим, что мы пишем программу для строителей-подрядчиков, которая работает со строительными материалами. Нам нужен класс, определяющий коли- чество стройматериалов каждого типа, например 100 восьмиметровых бревен. Другой класс должен хранить различные данные о каждом виде стройматериа-

лов. Например, длину куска материала, количество таких кусков и стоимость за погонный метр.

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

Мы используем класс Distance из предыдущего примера для хранения длины материала. Наконец, мы создали класс Lumber который является производным классов Туре и Distance. Далее рассмотрим листинг программы ENGLMULT.

// englmult.cpp

// программа демонстации множественного наследования

#include <iostream>

#include <string>               

using namespace std;

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

class Type                    //Тип древесины

   {

   private:

      string dimensions;

      string grade;

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

      Type() : dimensions("N/A"), grade("N/A")

         {  }

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

      Type(string di, string gr) : dimensions(di), grade(gr)

         {  }

      void gettype()          //запрос информации у пользователя

         {

         cout << "   Введите номинальные размеры(2x4 и т.д.): ";

         cin >> dimensions;

         cout << "   Введите сорт(необработанная,брус и т.д.): ";

         cin >> grade;

         }

      void showtype() const       //показ информации

         {

         cout << "\n   Размеры: " << dimensions;

         cout << "\n   Сорт: " << grade;

         }

   };

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

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

   {

   private:

      int feet;

      float inches;

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

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

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

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

         {  }

      void getdist()          //запрос информации у пользователя

         {

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

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

         }

      void showdist() const       //показ информации

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

   };

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

class Lumber : public Type, public Distance

   {

   private:

      int quantity;                 //количество штук

      double price;                 //цена за штуку

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

      Lumber() : Type(), Distance(), quantity(0), price(0.0)     

         {  }

                                                     //конструктор с шестью параметрами

      Lumber( string di, string gr, //параметры для Type

              int ft, float in,     //параметры для Distance

              int qu, float prc ) : //наши собственные параметры

              Type(di, gr),         //вызов конструктора Type

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

              quantity(qu), price(prc)//вызов наших конструкторов

          {  }

      void getlumber()

         {

         Type::gettype();

         Distance::getdist();

         cout << "   Введите количество: "; cin >> quantity;

         cout << "   Введите цену: "; cin >> price;

         }

      void showlumber() const

         {

         Type::showtype();

         cout << "\n   Длина: ";

         Distance::showdist();

         cout << "\n   Стоимость " << quantity

                         << " штук: $" << ( price * quantity ) << " рублей";

         }

   };

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

int main()

{

   Lumber siding;        //используем конструктор без параметров

 

   cout << "\n  Информация об обшивке:\n";

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

 

                   //используем конструктор с шестью параметрами

   Lumber studs( "2x4", "const", 8, 0.0, 200, 4.45F );

 

                                         //показываем информацию

   cout << "\nОбшивка";  siding.showlumber();

   cout << "\nБрус";     studs.showlumber();

   cout << endl;

   return 0;

}

Главной особенностью этой программы является использование конструкто- ров производного класса Lumber. Они вызывают подходящие конструкторы классов Туре и Distance.

 

32