Демонстрация полиморфной обработки



Для тестирования нашей иерархии Employee программа source.cpp создает по объекту каждого из четырех конкретных классов SalariedEmployee, HourlyEmployee, CommissionEmployee и BasePlusCommissionEmployee. Программа производит манипуляции с этими объектами, сначала используя статическое связывание, а затем полиморфно, используя вектор указателей Employee. Строки 31-38 создают объекты четырех производных от Employee конкретных классов. Строки 43-51 выводят информацию о служащем и заработок для каждого из объектов. Каждый из вызовов элемент-функций в строках 43-51 является примером статического связывания — во время компиляции, поскольку в них используются дескрипторы-имена (а не ссылки или указатели, которые могли бы устанавливаться во время исполнения), по которым компилятор может идентифицировать тип каждого объекта и определить, какие из функций earnings и print вызываются.

Строка 55 выделяет вектор employees, который содержит четыре указателя Employee. Строка 57 устанавливает employees[ 0 ] на объект salariedEmployee. Строка 58 устанавливает employees[ 1 ] на объект hourlyEmployee. Строка 59 устанавливает employees[ 2 ] на объект commissionEmployee. Строка 60 устанавливает employees[ 3 ] на объект basePlusCommissionEmployee. Компилятор разрешает эти присваивания, поскольку SalariedEmployee является Employee, HourlyEmployee является Employee, CommissionEmployee является Employee и BasePlusCommissionEmployee является Employee. Следовательно, мы можем присваивать адреса объектов SalariedEmployee, HourlyEmployee, CommissionEmployee и BasePlusCommissionEmployee указателям базового класса Employee (несмотря на то, что Employee — абстрактный класс).

Оператор for в строках 68-69 проходит по вектору employees и активирует для каждого элемента вектора функцию virtualViaPointer (строки 83-87). Функция virtualViaPointer в параметре baseClassPtr (типа const Employee * const) принимает адрес, хранящийся в элементе employees. Каждый вызов virtualViaPointer использует baseClassPtr для активации виртуальных функций print (строка 85) и earnings (строка 86). Заметьте, что функция virtualViaPointer не содержит никакой информации о типах SalariedEmployee, HourlyEmployee, CommissionEmployee или 

BasePlusCommissionEmployee. Функции известен только тип базового класса Employee. Следовательно, во время компиляции компилятор не может знать, функции каких конкретных классов должны вызываться через baseClassPtr. И все же во время исполнения каждый вызов виртуальной функции активирует функцию 

объекта, на который в данный момент указывает baseClassPtr. Вывод программы подтверждает, что действительно для каждого класса вызываются соответствующие функции и выводится информация, соответствующая типу объекта. Например, для SalariedEmployee выводится недельный оклад, а для CommissionEmployee и BasePlusCommissionEmployee выводится объем продаж. Заметьте также, что полиморфное определение заработка каждого служащего в строке 86 дает те же результаты, что определение заработка посредством статического связывания в строках 44, 46, 48 и 50. Все виртуальные вызовы функций print и earnings разрешаются во время исполнения посредством динамического связывания.

Наконец, другой оператор for (строки 75-76) проходит вектор employees и активирует для каждого элемента вектора функцию virtualViaReference (строки 91-95). Функция virtualViaReference в параметре baseClassRef (типа const Employee &) принимает ссылку, образованную разыменованием указателя в элементе employees (строка 76). Каждый вызов virtualViaReference активирует через ссылку baseClassRef виртуальные функции print (строка 93) и earnings (строка 94), демонстрируя, что виртуальная обработка реализуется и при использовании ссылок базового класса. Каждый вызов виртуальной функции активирует функцию объекта, на который во время исполнения ссылается baseClassRef. Это еще один пример динамического связывания. Вывод, получаемый при использовании ссылок базового класса, совпадает с тем, что получается при использовании указателей.

 


Дата добавления: 2018-08-06; просмотров: 211; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!