С++ для начинающих


         

Оператор dynamic_cast - часть 3


   int salary();

   int bonus();

};

Напомним, что payroll() принимает в качестве параметра указатель на базовый класс employee. Мы можем применить оператор dynamic_cast для получения указателя на производный programmer и воспользоваться им для вызова функции-члена bonus():

void company::payroll( employee *pe )

{

   programmer *pm = dynamic_cast< programmer* >( pe );

   // если pe указывает на объект типа programmer,

   // то dynamic_cast выполнится успешно и pm будет

   // указывать на начало объекта programmer

   if ( pm ) {

      // использовать pm для вызова programmer::bonus()

   }

   // если pe не указывает на объект типа programmer,

   // то dynamic_cast выполнится неудачно

   // и pm будет содержать 0

   else {

      // использовать функции-члены класса employee

   }

}

Оператор

dynamic_cast< programmer* >( pe )

приводит свой операнд pe к типу programmer*. Преобразование будет успешным, если pe ссылается на объект типа programmer, и неудачным в противном случае: тогда результатом dynamic_cast будет 0.

Таким образом, оператор dynamic_cast осуществляет сразу две операции. Он проверяет, выполнимо ли запрошенное приведение, и если это так, выполняет его. Проверка производится во время работы программы. dynamic_cast безопаснее, чем другие операции приведения типов в C++, поскольку проверяет возможность корректного преобразования.

Если в предыдущем примере pe действительно указывает на объект типа programmer, то операция dynamic_cast завершится успешно и pm будет инициализирован указателем на объект типа programmer. В противном случае pm получит значение 0. Проверив значение pm, функция company::payroll() может узнать, указывает ли pm на объект programmer. Если это так, то она вызывает функцию-член programmer::bonus() для вычисления премии программисту. Если же dynamic_cast завершается неудачно, то pe указывает на объект типа manager, а значит, необходимо применить более общий алгоритм расчета, не использующий новую функцию-член programmer::bonus().




Содержание  Назад  Вперед