Создание иерархии наследования CommissionEmployee — BasePlusCommissionEmployee



Пример 3 (можно набрать)

Двоеточие (:) в определения класса указывает на наследование. Ключевое слово public указывает тип наследования. Как производный класс (порожденный открытым наследованием), BasePlusCommissionEmployee наследует все элементы класса CommissionEmployee, за исключением конструктора; каждый класс определяет свои собственные, специфические для него конструкторы. [Заметьте, что деструкторы также не наследуются.]          Таким образом, в число открытых услуг класса BasePlusCommissionEmployee входят его конструктор и открытые элемент-функции, наследуемые от класса CommissionEmployee, — хотя мы и не можем видеть эти унаследованные функции в исходном коде BasePlusCommissionEmployee, они, тем не менее, являются частью этого производного класса. К открытым услугам класса принадлежат также элемент-функции setBaseSalary, getBaseSalary, earnings и print. Конструктор демонстрирует синтаксис инициализатора базового класса (строка 14), который в инициализаторе элемента передает аргументы конструктору базового класса (CommissionEmployee). C++ требует, чтобы конструктор производного класса вызывал конструктор своего базового класса для инициализации унаследованных элементов данных. В ф-ии earnings() Компилятор генерирует ошибки так как элементы данных commissionRate и grossSales класса CommissionEmployee являются закрытыми, — функциям производного класса BasePlusCommissionEmployee не разрешен доступ к закрытым данным базового класса CommissionEmployee. По той же причине компилятор выдает дополнительные сообщения для строк функции print класса BasePlusCommissionEmployee. Как видите, C++ строго относится к ограничениям на доступ к закрытым данным, так что даже производный класс (близко родственный базовому) не может обращаться к закрытым данным базового класса.

Ошибок в BasePlusCommissionEmployee можно было бы избежать, если воспользоваться get -функциями, унаследованными от класса CommissionEmployee. Например, строка для доступа к закрытым элементам данных commissionRate и grossSales класса могла бы вызывать getCommissionRate и getGrossSales. Точно так же можно было бы воспользоваться соответствующими get-функциями для извлечения значений элементов данных базового класса. В следующем примере мы покажем, что использование защищенных данных также позволяет предотвратить ошибки, с которыми мы столкнулись в этом примере.

Иерархия наследования CommissionEmployee ----BasePlusCommissionEmployee с защищенными данными

Пример 4(можно набрать)

Чтобы разрешить классу BasePlusCommissionEmployee непосредственно

обращаться к элементам данных first Name, lastName, socialSecurityNumber, grossSales и commissionRate класса CommissionEmployee, мы можем объявить эти элементы в базовом классе как protected. к защищенным элементам базового класса могут обращаться элементы и друзья базового класса и элементы и друзья любых классов, производных от данного базового класса.

Поскольку класс BasePlusCommissionEmployee — производный от данной версии Commission Employee, его объекты могут теперь обращаться к унаследованным элементам данных, объявленных в классе CommissionEmployee как protected (т.е. к элементам first Name, lastName, socialSecurityNumber, grossSales и commissionRate). В результате компилятор теперь не генерирует ошибок при компиляции определений элемент-функций earnings и print класса BasePlusCommissionEmployee . Это подтверждает особые привилегии, предоставляемые производному классу в плане доступа к защищенным элементам базового класса. Объекты производного класса могут также обращаться к защищенным элементам любого из его косвенных базовых классов.

Код класса BasePlusCommissionEmployee (т.е. файлы заголовка и реализации) составляет в данном случае 74 строки, что значительно короче кода для версии класса без наследования, который содержал 154 строки, благодаря тому, что версия с наследованием ассимилирует часть свойств класса CommissionEmployee, в то время как версия без наследования ничего не ассимилирует. Кроме того, теперь существует единственный экземпляр функционального кода CommissionEmployee, который объявлен и определен в классе CommissionEmployее. Это делает исходный код проще для сопровождения, модификации и отладки.

 


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

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






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