Объектно-ориентированное программирование на C++. Андрианова А.А - 113 стр.

UptoLike

Объектно-ориентированное программирование на С++
// распечатка информации о сдаче экзамена
// студентами группы
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