实验六答案
1、创建一个表示雇员信息的employee类,其中包含数据成员name、empNo和salary,分
别表示雇员的姓名、编号和月薪。
再从employee类派生出3个类worker、technician 和salesman,分别代表普通工人、科研人员、销售人员。
三个类中分别包含数据成员productNum、workHours和monthlysales,分别代表工人每月生产产品的数量、科研人员每月工作的时数和销售人员每月的销售额。
要求在employee类中声明虚成员函数pay,并在各个派生类中覆盖pay函数,用来计算雇员的月薪,并假定:
普通工人的月薪=每月生产的产品数×每件产品的赢利×20%
科研人员的月薪=每月的工作时数×每小时工作的酬金
销售人员的月薪=月销售额×销售额提成。
创建一个通用函数CalculateSalary,用来计算并返回各种不同类型雇员的月薪。
函数CalculateSalary的原型如下:
float CalculateSalary(employee *emptr) ;
在main函数中分别声明worker类、technician类和salesman类的对象代表各种类型的雇员,并调用函数CalculateSalary计算他们的月薪。
解:程序代码如下:
#include<iostream>
using namespace std;
class employee
{
protected:
char name[20];
int empNo;
float salary;
public:
employee(char *cp="",int no=1001);
employee(employee&);
void setname(char *cp);
void setempNo(int no);
void setsalary(float sa);
char*getname();
int getempNo();
float getsalary();
virtual float pay(){ return 0;}
};
employee::employee(char *cp,int no)
{
int i=0;
while(*cp)
{
name[i]=*cp;
i++;
cp++;
}
name[i]='\0';
empNo=no;
}
employee::employee(employee &em) {
int i=0;
while([i])
{
name[i]=[i];
i++;
}
name[i]='\0';
empNo=em.empNo;
salary=em.salary;
}
void employee::setname(char *cp) {
int i=0;
while(*cp)
{
name[i]=*cp;
i++;
cp++;
}
name[i]='\0';
}
void employee::setempNo(int no) {
empNo=no;
}
void employee::setsalary(float sa) {
salary=sa;
}
char*employee::getname()
{
return name;
}
int employee::getempNo()
{
return empNo;
}
float employee::getsalary()
return salary;
}
class worker : public employee
{
public:
worker(char*,int,int);
void setproductNum(int n)
{ productNum=n;}
int getproductNum()
{ return productNum;}
float pay();
private:
int productNum;
static float proper; //每件产品的利润
};
float worker::proper=20; //假设每件产品的利润为20元worker::worker(char *name,int no,int pronum)
:employee(name,no)
{
productNum=pronum;
}
float worker::pay()
{
salary=productNum*proper*0.2;
return salary;
}
class technician : public employee
{
public:
technician(char*,int,float);
void sethours(float h)
{ workHours=h;}
float gethours()
{ return workHours;}
float pay();
private:
float workHours;
static float payperhour; //科研人员每小时工作的酬金
};
float technician::payperhour=40; //假设科研人员每小时工作的酬金为40元technician::technician(char *name,int no,float hours)
:employee(name,no)
workHours=hours;
}
float technician::pay()
{
salary=workHours*payperhour;
return salary;
}
class salesman : public employee
{
public:
salesman(char*,int,float);
void setmonthlysales(int num)
{ monthlysales=num;}
int getmonthlysales()
{ return monthlysales;}
float pay();
private:
float monthlysales;
static float percent; //销售人员的销售提成
};
float salesman::percent=0.5; //假设销售人员的销售提成为50% salesman::salesman(char *name,int n,float sn)
:employee(name,n)
{
monthlysales=sn;
}
float salesman::pay()
{
salary=monthlysales*percent;
return salary;
}
float CalculateSalary(employee *emptr)
{
float salary=emptr->pay();
return salary;
}
void main()
{
worker w1("张三",1001,1000);
technician t1("李四",1002,200);
salesman s1("王五",1003,10000);
cout<<"工人"<<w1.getname()<<"的月薪为"<<CalculateSalary(&w1)<<"元\n";
cout<<"科研人员"<<t1.getname()<<"的月薪为"<<CalculateSalary(&t1)<<"元\n";
cout<<"销售人员"<<s1.getname()<<"的月薪为"<<CalculateSalary(&s1)<<"元\n"; }。