●试题五
阅读下列程序说明,将应填入(n)处的字句写在答卷纸的对应栏内。
【程序说明】
对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如,管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人员类又从管理人员类中派生。
下面的程序1完成上述各个类的定义,并建立了3个雇员(一个普通雇员、一个管理人员和一个主管)的档案,并打印出各自的工资表。将"程序1"中的成员函数定义为内联函数,pay成员函数定义为虚函数,重新完成上述要求。
【程序1】
//普通雇员类
class Employee
{
public:
Employee(char*theName,float thePayRate);
char*getName()const;
float getPayRate()const;
float pay(float hoursWorked)const;
protected:
char*name;//雇员名称
float payRate;//薪水等级
};
Employee::Employee(char*theName,float thePayRate)
{
name=theName;
payRate=thePayRate;
}
char*Employee::getName() const
{
return name;
}
float Employee::getPayRate()const
{
return payRate;
}
float Employee::pay(float hoursWorked)const
{
return hoursWorked*payRate;
}
//管理人员类
class Manager∶public Employee
{
public:
//isSalaried付薪方式:true付薪固定工资,false按小时付薪
Manager(char*theName,float thePayRate,bool isSalaried);
bool getSalaried()const;
float pay(float hoursWorked)const;
protected:
bool salaried;
};
Manager::Manager(char*theName,float thePayRate,bool isSalaried)
∶Employee(theName,thePayRate)
{
salaried=isSalaried;
}
bool Manager::getSalaried() const
{
return salaried;
}
float Manager::pay(float hoursWorked)const
{
if(salaried)
return payRate;
/*else*/
return Employee::pay(hoursWorked);
}
//主管人员类
class Supervisor:public Employee
{
public:
Supervisor(char*theName,float thePayRate,float theBouns):
Employee(theName,thePayRate, (1) ),bouns(theBouns){}
float getBouns()const{return bouns;}
float pay(float hoursWorked)const
return (2) ;
}
protected:
float bouns;
}
#include"iostream.h"
void main()
{
Employee e("Jack",50.00);
Manager m("Tom",8000.00,true);
Supervior s("Tanya",8000.00,8000.00);
cout<<"Name:"< cout<<"Pay:"< cout<<"Name:"< cout<<"Pay:"< cout<<"Name:"< cout<<"Pay:"< } 【程序2】 #include"employee.h" //普通雇员类 class Employee { public: //构造函数 Employee(string theName,float thePayRate): name(theName),payRate(thePayRate){} //取雇员姓名 string getName() const{returnname;} //取雇员薪水等级 float getPayRate()const{return payRate;} //计算雇员薪水 virtual float pay(float hoursWorked)const{return (3) ;} protected: string name;//雇员名称 float payRate;//薪水等级 }; //管理人员类 //继承普通雇员类 class Manager:public Employee { public: //构造函数 //isSalaried标识管理人员类的付薪方式 //true 按阶段付薪(固定工资) //false按小时付薪 Manager(string theName,float thePayRate,bool isSalaried): Employee(theName,thePayRate),salaried(isSalaried){} //取付薪方式 bool getSalaried()const{return salaried;} //计算薪水 virtual float pay(float (4) )const; protected: bool salaried; }; float Manager::pay(float hoursWorked)const { if(salaried)//固定付薪方式 return payRate; else//按小时付薪 return (5) ; } //主管人员类 class Supervisor: (6) { public: //构造函数 Supervisor(string theName,float thePayRate,float theBouns): Manager(theName,thePayRate,true),bouns(theBouns){} //取奖金数额 float getBouns()const{return bouns;} //计算薪水 virtual float pay(float hoursWorked)const { retum payRate+bouns; } (7) float bouns; } #include"employee.h" #include"iostream.h" void main() { (8) *ep[3];ep[0]=new Employee("Jack","50.00"); ep[1]=new Manager("Tom","8000.00",true); ep[2]=new Supervior("Tanya","8000.00","8000.00"); for(int i=0;i<3;i++){ cout<<"Name:"<< (9) < cout<<"Pay:"<< (10) < } }