544 __________Часть IV. Новые возможности C++.
void printAHEmployees () {
for (int count = 0; count < numberOfEmployees; count++)
{
companyEmployee[count]->PrintData() ;
}
Поскольку мы вызываем printData для экземпляров Employee, вы можете предположить, что для каждого служащего в компании выводится его номер социального страхования (так реализована PrintData для класса Employee). Но на самом деле функция-член PrintData размещается в каждом производном классе. Если companyEmployee [ о ] — это Manager, вызывается метод Manager: : PrintData. ЕСЛИ companyEmployee [53] — ЭТО Engineer, TO вызывается метод- Engineer: : PrintData. У нас есть одна переменная companyEmployee [count], для которой мы вызываем printData, а на самом деле она может вести себя как переменная класса Employee или любого производного от него класса. В этом и есть весь полиморфизм.
А если бы возможности полиморфизма были нам недоступны? Как бы мы вызывали PrintData на языке типа С, например, которому большей частью не хватает объектно-ориентированных программных конструкций? Мы бы могли объявить флаг для каждого типа служащих, а затем проверять этот флаг в большом операторе switch, вызывающем соответствующие функции:
switch(employeeType) (
case EMPLOYEE:
// Вызов функции печати для служащего break;
case HOORLY_EMPLOYEE:
// Вызов функции печати для служащего с повременной оплатой case SALARIEDJ3MPLOYEE:
// Вызов функции печати для служащего на окладе break;
// и так далее...
Такая стратегия, конечно, требует много времени, довольно трудна и наконец просто слишком длинна. Применение полиморфизма в вашем коде может помочь избежать таких конструкций. Позже мы рассмотрим пример.
Замечание
1 Существует более короткий способ реализации полиморфизма в С, и, если вы когда-нибудь занимались объектно-ориентированным программирова-