Упражнения
1. Опишите класс JetPlane (Реактивный самолет), наследуя его от двух базовых классов — Rocket (Ракета) и Airplane (Самолет).
class JetPlane : public Rocket, public Airplane
2. Произведите от класса JetPlane, объявленного в первом упражнении, новый класс 747.
class 747 : public JetPlane
3. Напишите программу, производящую классы Саг (Легковой автомобиль) и Bus (Автобус) от класса Vehicle (Машина). Опишите класс Vehicle как абстрактный тип данных с двумя чистыми виртуальными функциями. Классы Саг и Bus не должны быть абстрактными.
class Vehicle
{
   virtual void Move() = 0;
   virtual void Haul() = 0;
};
class Car : public Vehicle
{
   virtual void Move();
   virtual void Haul();
}:
class Bus : public Vehicle
{
   virtual void Move();
   virtual void Haul();
};
4. Измените программу из предыдущего упражнения таким образом, чтобы класс Саr тоже стал ADT, и произведите от него три новых класса: SportsCar (Спортивный автомобиль), Wagon (Фургон) и Coupe (Двухместный автомобиль-купе). В классе Саr должна замещаться одна из виртуальных функций, объявленных в классе Vehicle, с вызовом функции базового класса.
class Vehicle
{
   virtual void Move() = 0;
   virtual void Haul() = 0;
};
class Car : public Vehicle
{
   virtual void Move():
};
class Bus : public Vehicle
{
   virtual void Move();
   virtual void Haul();
}
class SportsCar : public Car
{
   virtual void Haul();
}
class Coupe : public Car
{
   virtual void Haul();
}
День 14
Контрольные вопросы 
1. Могут ли статические переменные-члены быть закрытыми?
Да. Поскольку они являются переменными-членами, то доступ к ним может управляться подобно доступу к любым другим переменным-членам. Если статическая переменная-член объявлена как закрытая, то доступ к ней можно получить только с помошью открытого статического метода класса.
2. Объявите статическую переменную-член.
static int itsStatic;
3. Объявите статическую функцию.
static int SomeFunction();
4. Объявите указатель на функцию, принимающую параметр типа int и возвращающую значение типа long.
long (*function)(int);
5. Измените указатель, созданный в задании 4, на указатель на функцию-член класса Саr.
long ( Car::*function)(int);
6. Объявите массив из десяти указателей, созданных в задании 5.
long ( Car::*function)(int) theArray [10];
 Упражнения
 1. Напишите короткую программу, объявляющую класс с одной обычной переменной-членом и одной статической переменной-членом. Создайте конструктор, выполняющий инициализацию переменной-члена и приращение статической переменной-члена. Затем объявите деструктор, который уменьшает на единицу значение статической переменной.
1: class myClass
2: {
3:    public:
4:       myClass();
5:       ~myClass();
6:    private:
7:       int itsMember;
8:       static int itsStatic;
9: };
10:
11: myClass::myClass():
12: itsMember(1)
13: {
14:    itsStatic++;
15: }
16:
17:myClass::~myClass()
18: {
19:    itsStatic—-;
20: }
21:
22: int myClass::itsStatic = 0;
23:
24: int main()
25: {}
2. Используя программный блок из упражнения 1, напишите короткую выполняемую
программу, которая создает три объекта, а затем выводит значения их перемен-
ных-членов и статической переменной-члена класса. Затем последовательно уда-
ляйте объекты и выводите на экран значение статической переменной-члена.
1: #include <iostream.h>
2:
3: class myClass
4: {
5:    public:
6:       myClass();
7:       ~myClass();
8:       void ShowMember()
9:       void ShowStatic();
10:   private:
11:      int itsMember;
12:      static int itsStatic;
13: };
14:
15: myClass::myClass():
16: itsMember(1)
17: {
18:    itsStatic++;
19: }
20:
21: myClass::~myClass()
22: {
23:    itsStatic--;
24:    cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29:    cout << "itsMember: " << itsMereber << endl;
30: }
31:
32: void myClass::ShowStatic()
33: {
34:    cout << "itsStatic: " << itsStatic << endl;
35: }
36: int myClass::itsStatic = 0;
37:
38: int main()
39: {
40:    myClass obj1;
41:    obj1.ShowMember();
42:    obj1.ShowStatic();
43:
44:    myClass obj2;
45:    obj2.ShowMember();
46:    obj2.ShowStatic();
47:
48:    myClass obj3;
49:    obj3.ShowMember();
50:    obj3.ShowStatic();
51:    return 0;
52: }
3. Измените программу из упражнения 2 таким образом, чтобы доступ к статическойпеременной-члену осуществлялся с помощью статической функции-члена. Сделайте статическую переменную-член закрытой.
1: #include <iostream.h>
2:
3: class myClass
4: {
5:    public:
6:       myClass();
7:       ~myClass();
8:       void ShowMember();
9:       static int GetStatic();
10:   private:
11:      int itsMember;
12:      static int itsStatic;
13: }
14:
15: myClass::myClass():
16: itsMember(l)
17: {
18:    itsStatic++;
19: }
20:
21: myClass::~myClass()
22: {
23:    itsStatic--;
24:    cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29:    cout << "itsMember: " << itsMember << endl;
30: }
31:
32: int myClass::itsStatic = 0;
33:
34: void myClass::GetStatic()
35: {
36:    return itsStatic;
37: }
38:
39: int main()
40: {
41:    myClass obj1:
42:    obj1.ShowMeraber();
43:    cout << "Static: " << myClass::GetStatic() << endl;
44:
45:    myClass obj2;
46:    obj2.ShowMember();
47:    cout << "Static " << myClass::GetStatic() << endl;
48:
49:    myClass obj3;
50:    obj3.ShowMember();
51:    cout << "Static: " << myClass::GetStatic() << endl;
52:    return 0;
53: }
4. Создайте в программе из упражнения 3 указатель на функцию-член для доступа к значению нестатической переменной-члена и воспользуйтесь им для вывода этих значений на печать.
1: #include ciostream.h>
2:
3: class myClass
4: {
5:    public
6:       myClass();
7:       ~myClass();
8:       void ShowMember();
9:       static int GetStatic();
10:   private:
11:      int itsMember;
12:      static int itsStatic;
13: }
14:
15: myClass::myClass():
16: itsMember(1)
17: {
18:    itsStatic++;
19: }
20:
21: myClass::~myClassO
22: {
23:    itsStatic--;
24:    cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29:    cout << "itsMember: " << itsMember << endl;
30: }
31:
32: int myClass::itsStatic = 0;
33:
34: int myClass::GetStatic()
35: {
36:    return itsStatic;
37: }
38:
39: int main()
40: {
41:    void (myClass::*PMF) ();
42:
43:    PMF=myClass: :ShowMember;
44:
45:    myClass obj1;
46:    (obj1.*PMF)();
47:    cout << "Static: " << myClass::GetStatic() << endl;
48:
49:    myClass obj2:
50:    (obj2.*PMF)();
51:    cout << "Static: " << myClass::GetStatic() << endl;
52:
53:    myClass obj3;
54:    (obj3.*PMF)();
55:    cout << "Static: " << myClass::GetStatic() << endl;
56:    return 0;
57: }
5. Добавьте две дополнительные переменные-члена к классу из предыдущих упраж-
нений. Добавьте методы доступа, возвращающие значения всех этих переменных.
Все функции-члены должны возвращать значения одинакового типа и иметь оди-
наковую сигнатуру. Для доступа к этим методам используйте указатель на функ-
цию-член.
1: #include<iostream.h>
2:
3: class myClass
4: {
5:    public:
6:       myClass();
7:       ~myClass();
8:       void ShowMember();
9:      void ShowSecond();
10:      void ShowThird();
11:      static int GetStatic();
12:   private:
13:      int itsMember;
14:      int itsSecond;
15:      int itsThird;
16:      static int itsStatic;
17: }
18:
19: myClass::myClass()
20:    itsMember(1),
21:    itsSecond(2),
22:    itsThird(3)
23: {
24:    itsStatic++;
25: }
27: myClass::^rnyClass()
28: {
29:    itsStatic--;
30:    cout << "In destructor. ItsStatic: " << itsStatic << endl;
31: }
32:
33: void myClass::ShowMember()
34: {
35:    cout << "itsMember: " << itsMember << endl;
36: }
37:
38: void myCIass:: ShowSecond()
39: {
40:    cout << "itsSecond: " << itsSecond << endl;
41: }
42:
43: void myClass::ShowThird()
44: {
45:    cout << "itsThird: " << itsThird << endl;
46: }
47: int myClass::itsStatic = 0;
48:
49: int myClass::GetStatic()
50: {
51:    return itsStatic;
52: }
53:
54: int main()
55: {
56:    void (myClass::*PMF) ();
57:
58:    myClass obj1;
59:    PMF=myClass::ShowMember;
60:    (obj1.*PMF)();
61:    PMF=myClass::ShowSecond;
62:    (obj1.*PMF)();
63:    PMF=myClass::ShowThird;
64:    (ob]1 "PMF)();
65:    cout << "Static: " << myClass::GetStatic() << endl;
66:
67:    myClass obj2;
68:    PMF=myClass::ShowMerober;
69:    (obj2.*PMF)();
70:    PMF=myClass::ShowSecond;
71:    (obj2.*PMF)();
72:    PMF=myClass::ShowThird;
73:    (obj2. *PMF)();
74:    cout << "Static: " << myClass::GetStatic() << endl;