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

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

Методы классов и множественное наследование

Рассмотрим пример множественного наследования. Пусть нам для некоторых служащих необходимо указать их образование в программе EMPLOY. Теперь пред- положим, что в другой программе у нас существует класс student, в котором ука- зывается образование каждого студента. Тогда вместо изменения класса employee мы воспользуемся данными класса student с помощью множественного наследо- вания.

В классе student содержатся сведения о школе или университете, которые за- кончил студент, и об уровне полученного им образования. Эти данные хранятся в строковом формате. Методы getedu() и putedu() позволяют нам ввести данные о студенте и просмотреть их.

Информация об образовании нужна нам не для всех служащих. Предполо- жим, что нам не нужны записи об образовании рабочих, а необходимы только записи об ученых и менеджерах. Поэтому мы модифицируем классы manager и scientist так, что они будут являться производными классов employee и student, как показано на рис. 9.10.

Рис. 9.10. Диаграмма классов UML программы EMPMULT

Эта маленькая программа показывает только взаимосвязь между классами:

class student

{ };

class employee

{ };

class manager : public employee, private student

{ };

class scientist : private employee, private student

{ };

class laborer : public employee

{ };

Теперь мы рассмотрим эти классы более детально в листинге EMPMULT.

// empmult.cpp

// множественное наследование

#include <iostream>

using namespace std;

const int LEN = 80;       // максимальная длина имени

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

class student             // сведения об образовании

{

  private:

    char school[ LEN ];   // название учебного заведения

    char degree[ LEN ];   // уровень образования

  public:

    void getedu ( )

      {

        cout << "  Введите название учебного заведения: ";

        cin >> school;

        cout << "  Введите степень высшего образования\n";

 

 

cout << "  (неполное высшее, бакалавр, магистр, кандидат наук): ";

        cin >> degree;

      }

    void putedu ( ) const

      {

        cout << "\n  Учебное заведение: " << school;

        cout << "\n  Степень: " << degree;

      }

};

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

class employee            // некий сотрудник

{

  private:

    char name[ LEN ];     // имя сотрудника

    unsigned long number; // номер сотрудника

  public:

    void getdata ( )

      {

        cout << "\n  Введите фамилию: "; cin >> name;

        cout << "  Введите номер: ";     cin >> number;

      }

    void putdata ( ) const

      {

        cout << "\n  Фамилия: " << name;

        cout << "\n  Номер: " << number;

      }

};

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

class manager : private employee, private student // менеджер

{

  private:

    char title[ LEN ];    // должность сотрудника

    double dues;          // сумма взносов в гольф-клуб

  public:

    void getdata ( )

      {

        employee::getdata ( );

        cout << "  Введите должность: "; cin >> title;

        cout << "  Введите сумму взносов в гольф-клуб: "; cin >> dues;

        student::getedu ( );

      }

    void putdata ( ) const

      {

        employee::putdata ( );

        cout << "\n  Должность: " << title;

        cout << "\n  Сумма взносов в гольф-клуб: " << dues;

        student::putedu ( );

      }

};

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

class scientist : private employee, private student // ученый

{

  private:

    int pubs;             // количество публикаций

  public:

    void getdata ( )

      {

        employee::getdata ( );

        cout << "  Введите количество публикаций: "; cin >> pubs;

student::getedu ( );

      }

    void putdata ( ) const

      {

        employee::putdata ( );

        cout << "\n  Количество публикаций: " << pubs;

        student::putedu ( );

      }

};

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

class laborer : public employee // рабочий

{

};

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

int main ( )

{

  manager m1;

  scientist s1, s2;

  laborer l1;

 

  // введем информацию о нескольких сотрудниках

  cout << endl;

  cout << "\nВвод информации о первом менеджере";

  m1.getdata ( );

 

  cout << "\nВвод информации о первом ученом";

  s1.getdata ( );

 

  cout << "\nВвод информации о втором ученом";

  s2.getdata ( );

 

  cout << "\nВвод информации о первом рабочем";

  l1.getdata ( );

 

  // выведем полученную информацию на экран

  cout << "\nИнформация о первом менеджере";

  m1.putdata ( );

 

  cout << "\nИнформация о первом ученом";

  s1.putdata ( );

 

  cout << "\nИнформация о втором ученом";

  s2.putdata ( );

 

  cout << "\nИнформация о первом рабочем";

  l1.putdata ( );

 

  cout << endl;

  return 0;

}

 

Функции getdata() и putdata() классов manager и scientist включают в себя такие вызовы функций класса student, как

student::getedu ( ); и

student::putedu ( );

Эти методы доступны классам manager и scientist, поскольку названные клас- сы наследуются от класса student.

Рассмотрим небольшой пример работы программы EMPMULT:

Введите данные для менеджера 1 Введите фамилию: Иванов Введите номер: 12 Введите должность: Вице-президент Введите сумму взносов в гольф-клуб: 1000000 Ведите название школы или университета: СПбГУ Введите полученную ученую степень: бакалавр

Введите данные для ученого 1 Введите фамилию: Петров Введите номер: 764 Введите количество публикаций: 99 Введите название школы или университета: МГУ Введите полученную ученую степень: кандидат наук

Введите данные для ученого 2 Введите фамилию: Сидоров Введите номер: 845 Введите количество публикаций: 101 Введите название школы или университета: МГУ Введите полученную ученую степень: доктор наук

Введите данные для рабочего 1 Введите фамилию: Строкин Введите номер: 48323

Как мы видим, программы EMPLOY и EMPLOY2 работают примерно одинаково.

 

30