Глава 20. Наследование и полиморфизм_________________________539
Т. е. ФУНКЦИИ SetSocialSecurityNuraber И GetSocialSecurityNumber. ПрИЗНать-
ся, номер социального страхования не слишком заслуживает того, чтобы строить на нем класс, но он подойдет для целей этого примера.
Теперь рассмотрим задачу создания класса по имени salariedEmpioyee (служащий на окладе), который включает номер социального страхования в дополнение к верхней и нижней границам изменения оклада, без наследования какой-либо информации или функциональности от класса Employee. Такая задача заставляет программиста заново изобретать колесо — и классу Employee, и классу SalariedEmpioyee нужно будет содержать элемент данных с именем socialsecurityNumber, а также некоторые функции-члены для доступа к данным, если данные закрыты. Такое дублирование усилий на разработку расточительно в смысле как времени, так и места, если не сказать, противоречит здравому смыслу, принимая во внимание иерархию машиностроительной фирмы, которую мы установили ранее.
Наследование (inheritance) позволяет нам получить преимущества существующих логических отношений между классами объектов, чтобы совместно использовать структуру и поведение наших классов C++. В случае класса SalariedEmpioyee мы можем унаследовать структуру номера социального страхования и поведение функций-членов, произведя новый класс из существующего базового класса Employee:
class SalariedEmpioyee : public Employee
{
public:
SalariedEmpioyee() ;
virtual ~SalariedEmployee();
void SetLowerSalaryRange(float) ;
float GetLowerSalaryRange() ;
void SetUpperSalaryRange(float) ;
float GetUpperSalaryRange() ;
private:
float lowerSalaryRange;
float upperSalaryRange;
Замечание
Если в нашей объектно-ориентированной конструкции для класса SalariedEmpioyee мы намерены осуществлять доступ к элементу данных socialsecurityNumber класса Employee непосредственно (т. е. без вызова SetSocialSecurityNumber ИЛИ GetSocialSecurityNumber), ТО нам НуЖНО Объ-
явить элемент socialsecurityNumber в нашем базовом классе Employee защищенным (protected), а не закрытым (private).
Легко спутать различные комбинации наследования и спецификаторов доступа, т. е., public— открытый, protected— защищенный и private— за-