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

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

Виртуальные функции и класс person

Теперь, уже зная, что такое виртуальные функции, рассмотрим области их при-

менения. Примером будет служить расширение программ PTROBJ и PERSORT из

главы 10 «Указатели». Новая программа использует все тот же класс person, но

добавлены два новых класса: student и professor. Каждый из этих производных

классов содержит метод isOutstanding(). С помощью этой функции администра-

ция школы может создать список выдающихся педагогов и учащихся, которых

следует наградить за их успехи. Листинг программы VIRTPERS:

Листинг 11.4. Программа VIRTPERS

 

// vitrpers.cpp

// виртуальные функции и класс person

#include <iostream>

using namespace std;

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

class person                    //класс person

    {

    protected:

      char name[40];

    public:

      void getName()

        { cout << "  Введите имя: "; cin >> name; }

      void putName()

        { cout << "  Имя: " << name << endl; }

      virtual void getData() = 0;      //чистые

      virtual bool isOutstanding() =0; //виртуальные

                                       //функции

    };

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

class student : public person   //класс student

    {

    private:

      float gpa;                //средний балл

    public:

      void getData()            //запросить данные об ученике у пользователя

        {                      

        person::getName();

        cout << "  Средний балл ученика:  "; cin >> gpa;

        }

 

 

Листинг 11.4 (продолжение)

 

bool isOutstanding()

        { return (gpa > 3.5) ? true : false; }

    };

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

class professor : public person //класс professor

    {

    private:

      int numPubs;              //число публикаций

    public:

      void getData()            //запросить данные о педагоге у

        {                       //пользователя

        person::getName();

        cout << "  Число публикаций:  "; cin >> numPubs;

        }

      bool isOutstanding()

        { return (numPubs > 100) ? true : false; }

    };

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

int main()

{

  person* persPtr[100];  //массив указателей на person

   int n = 0;            //число людей, внесенных в список char choice;

   char choice;

 

  do {

    cout << " Учащийся (s) или педагог (p): ";

    cin >> choice;

    if(choice=='s' )               //Занести нового ученика

      persPtr[n] = new student;   // в массив

    else                          //Занести нового

      persPtr[n] = new professor; //педагога в массив

    persPtr[n++]->getData();       //Запрос данных о персоне

    cout << " Ввести еще персону (y/n)? "; //создать еще персону

    cin >> choice;

    } while( choice=='y' );       //цикл, пока ответ 'y'

 

  for(int j=0; j<n; j++)

    {

    persPtr[j]->putName();        //Вывести все имена,

    if( persPtr[j]->isOutstanding() )        //сообщать о

      cout << "  Это выдающийся человек!\n"; //выдающихся

    }

  return 0;

}                      //Конец main()

 

Классы

Класс person — абстрактный, так как содержит чистые виртуальные функции

getData() и isOutstanding(). Никакие объекты класса person не могут быть созданы.

Он существует только в качестве базового класса для student и professor. Эти по-

рожденные классы добавляют новые экземпляры данных для базового класса.

Student содержит переменную gpa типа float, представляющую собой средний

балл учащегося. В классе Professor мы создали переменную numPubs типа int, кото-

рая представляет собой число публикаций педагога. Учащиеся со средним бал-

лом свыше 3,5 и педагоги, опубликовавшие более 100 статей, считаются выда-

 

ющимися. (Мы, пожалуй, воздержимся от комментариев по поводу критериев

оценки. Будем считать, что они выбраны условно.)

Функция isOutstanding()

IsOutstanding() объявлена чистой виртуальной функцией в классе person. В клас-

се student эта функция возвращает true, если gpa больше 3,5, в противном слу-

чае — false. В классе professor она возвращает true, если numPubs больше 100.

Функция GetData() запрашивает у пользователя GPA, если она запускается

для обслуживания класса student, или число публикаций для professor.

Программа main()

В функции main() мы вначале даем пользователю возможность ввести несколько

имен учащихся и педагогов. К тому же программа спрашивает средний балл уча-

щихся и число публикаций педагогов. После того, как пользователь закончит

ввод данных, программа выводит на экран имена всех учащихся и педагогов,

помечая выдающихся. Приведем пример работы программы:

Учащийся (s) или педагог (р): s

Введите имя: Сергеев Михаил

Средний балл ученика: 1.2

Ввести еще персону (y/n)? у

Учащийся (s) или педагог (р): s

Введите имя: Пупкин Василий

Средний балл ученика: 3.9

Ввести еще персону (y/n)? у

Учащийся (s) или педагог (р): s

Введите имя: Борисов Владимир

Средний балл ученика: 4.9

Ввести еще персону (y/n)? у

Учащийся (s) или педагог (р): р

Введите имя: Михайлов Сергей

Число публикаций: 714

Ввести еще персону (y/n)? у

Учащийся (s) ипи педагог (р): р

Введите имя: Владимиров Борис

Число публикаций: 13

Ввести еще персону (y/n)? n

Имя: Сергеев Михаил

Имя: Пупкин Василий

Это выдающийся человек!

Имя: Борисов Владимир

Это выдающийся человек!

Имя: Михайлов Сергей

Это выдающийся человек!

Имя: Владимиров Борис

 

8