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