Попередня програма не має конструкторів. Розглянемо приклад, що показує, як працюють конструктори при множинному успадковуванні. Далі приведена програма 11.10 використовує базові типи Type та Distance і похідний від обох цих класів тип Lumber.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
#include<string.h>
class Type
{private:
char *dimensions;
char *grade;
public:
Type():dimensions(“N/A”),grade(“N/A”)
{ }
Type(char *d1,char *d2):dimensions(d1),grade(d2)
{ }
void gettype()
{cout<<”Розмір:”;cin>>dimensions;
cout<<”Сорт:”;cin>>grade;
}
void showtype()
{
cout<<”Розмір:”<<dimensions<<endl;
cout<<”Сорт:”<<grade<<endl;
}
};
///////////////
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 (char *dt, char *gr,
int ft, float in,
int qu,float prc):Type(dt,gr),Distance(ft,in),quantity(qu),price(prc)
{ }
void getlumber()
{Type::gettype();
Distance::getdist();
cout<<”Введіть кількість:”;cin>>quantity;
cout<<”Введіть ціну:”;cin>>price;
}
void showlumber()const
{
Type::showtype();
cout<<”\n Dovjyna:”;
Distance::showdist();
cout<<”\n Вартість ”<<quantity<<” штук:”<<(price*quantity);
}
};
///////////////
int main()
{clrscr();
Lumber studs;
cout<<”\n Інформація\n”;
studs.getlumber();
Lumber studs1(“2x4”,”const”,8,1.0,200,14);
cout<<”\n1=”;studs.showlumber();
cout<<”\n2=”;studs1.showlumber();
bioskey(0);
return 0;
}
Програма 11.10
Головною особливістю цієї програми є використання конструкторів похідного класу Lumber. Вони викликають підходящі конструктори класів Type і Distance.
Конструктори без аргументів
В класі Type конструктор без аргументів виглядає так:
Type():dimensions(“N/A”),grade(“N/A”)
{ }
Цей конструктор присвоює значенням полів dimensions та grade значення рядка "N/A” (недоступно), тому при спробі вивести дані для об’єкту класу Lumber користувач знатиме, що поля порожні.
Ми вже використовували конструктор без аргументів в класі Distance
Distance():feet(0),inches(0.0)
{}
Конструктор без аргументів класу Lumber викликає конструктори обох класів – Type і Distance
Lumber():Type(),Distance(),quantity(0),price(0.0)
{}
Імена конструкторів базового класу вказані після двокрапки і розділені комами. При виклику конструктора класу Lumber починають роботу конструктори базових класів Type() і Distance(). При цьому ініціалізуються змінні quantity і price().
Конструктор з багатьма аргументами
Конструктор класу Type з двома аргументами виглядає так:
Type(char *d1,char *d2):dimensions(d1),grade(d2)
{ }
Цей конструктор копіює рядкові аргументи (типу char *) в поля класу dimensions та grade.
Конструктор класу Distance той сам, що і в попередній програмі
Distance(int ft,float in):feet(ft),inches(in)
{}
В конструктор класу Lumber включені обидва ці конструктори, які одержують значення аргументів.
Lumber (char *dt, char *gr,
int ft, float in,
int qu,float prc):Type(dt,gr),Distance(ft,in),quantity(qu),price(prc)
{ }
Крім того, клас Lumber має і свої власні аргументи. Таким чином, всього у конструктора 6 аргументів.