ВУЗ:
Составители:
Рубрика:
Объектно-ориентированное программирование на С++
// распечатка информации о сдаче экзамена
// студентами группы
void Group::PrintExam(int numExam)
{
cout << "Экзамен №" << (numExam + 1) << endl;
for(int i = 0; i < count; i++)
cout << (i + 1) << "."
<< students[i]->GetFio() << "\t"
<< students[i] -> GetExam(numExam) << endl;
}
Отдельно рассмотрим метод внесение оплаты студентом. Поскольку
эта операция относится только к студентам-контрактникам, при
просмотре списка студентов нужно определять тип объекта. Это
осуществляется с помощью оператора typeid, который возвращает
величину, идентифицирующую точный тип объекта. Этот оператор
определен в библиотеке RTTI (runtime type information – тип информации
времени выполнения), которая содержит стандартные возможности
программы по определению типа объекта во время ее выполнения.
// внесение оплаты студентом (по номеру зачетной книжки)
void Group::DescPayment(int ntb, double pay)
{
int i;
Student* std;
if(FindStudent(ntb, std, i))
// если студент-контрактник – вносится оплата
if(typeid(ContractStudent) == typeid(*std))
((ContractStudent*)std) -> DescCredit(pay);
}
Если тип студента является ContractStudent, то осуществим
явное преобразование указателя std к ContractStudent* для вызова
метода DescCredit(), который есть только в классе
ContractStudent.
Иногда в классе нельзя задать определение виртуальных функций,
поскольку поведение объектов производных классов очень сильно
отличается. Например, пусть создается приложение, которое формирует
рисунок, состоящий из графических примитивов (прямоугольник, эллипс,
надпись и т.д.). Все они обладают общими методами – их требуется
рисовать, перемещать, поворачивать, изменять размеры и т.д. Но
реализация этих методов для различных видов графических примитивов
будет сильно отличаться. Для унифицированной обработки всего набора
113
Объектно-ориентированное программирование на С++
// распечатка информации о сдаче экзамена
// студентами группы
void Group::PrintExam(int numExam)
{
cout << "Экзамен №" << (numExam + 1) << endl;
for(int i = 0; i < count; i++)
cout << (i + 1) << "."
<< students[i]->GetFio() << "\t"
<< students[i] -> GetExam(numExam) << endl;
}
Отдельно рассмотрим метод внесение оплаты студентом. Поскольку
эта операция относится только к студентам-контрактникам, при
просмотре списка студентов нужно определять тип объекта. Это
осуществляется с помощью оператора typeid, который возвращает
величину, идентифицирующую точный тип объекта. Этот оператор
определен в библиотеке RTTI (runtime type information – тип информации
времени выполнения), которая содержит стандартные возможности
программы по определению типа объекта во время ее выполнения.
// внесение оплаты студентом (по номеру зачетной книжки)
void Group::DescPayment(int ntb, double pay)
{
int i;
Student* std;
if(FindStudent(ntb, std, i))
// если студент-контрактник – вносится оплата
if(typeid(ContractStudent) == typeid(*std))
((ContractStudent*)std) -> DescCredit(pay);
}
Если тип студента является ContractStudent, то осуществим
явное преобразование указателя std к ContractStudent* для вызова
метода DescCredit(), который есть только в классе
ContractStudent.
Иногда в классе нельзя задать определение виртуальных функций,
поскольку поведение объектов производных классов очень сильно
отличается. Например, пусть создается приложение, которое формирует
рисунок, состоящий из графических примитивов (прямоугольник, эллипс,
надпись и т.д.). Все они обладают общими методами – их требуется
рисовать, перемещать, поворачивать, изменять размеры и т.д. Но
реализация этих методов для различных видов графических примитивов
будет сильно отличаться. Для унифицированной обработки всего набора
113
Страницы
- « первая
- ‹ предыдущая
- …
- 111
- 112
- 113
- 114
- 115
- …
- следующая ›
- последняя »
