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 Существует более короткий способ реализации полиморфизма в С, и, если вы когда-нибудь занимались объектно-ориентированным программирова-