ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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
Имя: Сергеев Михаил
Имя: Пупкин Василий
Это выдающийся человек!
Имя: Борисов Владимир
Это выдающийся человек!
Имя: Михайлов Сергей
Это выдающийся человек!
Имя: Владимиров Борис
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
Схожі підручники
- Еволюція теорій регіонального розвитку в економічній науці
- Естетика . Підручник (частин 2)
- Методичні рекомендації з курсу Релігієзнавство
- Бухгалтерський облік у галузях економіки (частина 1)
- Загальні питання з курсу «Теорія ймовірності та Математичної статистики»
- Методичні вказівки до виконання практичного заняття на тему «Теорія ігор.»
