定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleMana

要求:

(1)在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其它数据成员。

(2)各类人员的实发工资公式如下:

 

员工实发工资 = 基本工资 + 奖金 * 出勤率

销售员实发工资 = 基本工资 + 奖金 * 出勤率+ 个人销售额 * 销售员提成比例

经理实发工资 = 基本工资 + 奖金 * 出勤率+ 总销售额 * 经理提成比例

销售经理实发工资 =基本工资 + 奖金 * 出勤率+ 个人销售额 * 销售员提成比例+ 总销售额 * 经理提成比例

 

(3)每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。



#include"iostream"
using namespace std;
class Staff{
private:
	int num;
	char name[18];
	double rateofattend;
	int basicSal;
	int prize;
public:
	Staff(int a,char *b,double c,int d,int e):num(a),rateofattend(c),basicSal(d),prize(e){
		strcpy(name,b);
	}
	void Output(){
		cout << num << "  " << name << "  " << rateofattend << "  " << basicSal << "  " << prize << "  "; 
	}
	double OutputWage(){
		return (basicSal+prize*rateofattend);
	}
};

class Salemen:virtual public Staff{
private:
	double deductRate;
	double personAmount;
public:
	Salemen(int a,char *b,double c,int d,int e,double f,double g):Staff(a,b,c,d,e),deductRate(f),personAmount(g){};
	void Output(){
		Staff::Output();
		cout << deductRate << "  " << personAmount << "  " ; 
	}
	void display(){
		cout << deductRate << "  " << personAmount << "  " ;
	}
	double OutputWage(){
		return (Staff::OutputWage()+deductRate*personAmount);
	}
};

class Manager:virtual public Staff{
private:
	double totalDeductRate;
	double totalAmount;
public:
	Manager(int a,char *b,double c,int d,int e,double f,double g):Staff(a,b,c,d,e),totalDeductRate(f),totalAmount(g){};
	void Output(){
		Staff::Output();
		cout << totalDeductRate << "  " << totalAmount << "  " ;
	}
	void display(){
		cout << totalDeductRate << "  " << totalAmount << "  " ;
	}
	double OutputWage(){
		return (Staff::OutputWage()+totalDeductRate*totalAmount);
	}
};

class SaleManager:public Salemen,public Manager
{
public:
	SaleManager(int a,char *b,double c,int d,int e,double f,double g,double h,double i):Salemen(a,b,c,d,e,h,i),Manager(a,b,c,d,e,f,g),Staff(a,b,c,d,e){}
	void Output(){
		Staff::Output();
		Salemen::display();
		Manager::display();
	}
	double OutputWage(){
		return (Salemen::OutputWage()+Manager::OutputWage()-Staff::OutputWage());
	}
};

void main()
{
	Staff a(1,"liu",1,1000,500);
	a.Output();
	a.OutputWage();
	cout << endl ;
	Salemen b(2,"l",0.5,1000,500,5000,0.5);
	b.Output();
	b.OutputWage();
	cout << endl ;
	Manager c(3,"pp",0.5,1000,500,5000,0.5);
	c.Output();
	c.OutputWage();
	cout << endl ;
	SaleManager d(4,"p",0.5,1000,500,0.5,10000,0.5,3000);
	d.Output();
	d.OutputWage();
	cout << endl ;
}


某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。销售部经理(SalesManager),既是经理也是销售员。 以Employee为虚基派生Manager,Technician和Salesman;再进一步派生Developermanager和Salesmanager。 Employee属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得实发基本工资。 Technician派生属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Salesman派生属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Manager派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。 而DeveloperManager,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。 SalesManager,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。 编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。
好的,这是一个简单的人事管理系统的实现,你可以参考以下代码: ```cpp #include<iostream> #include<string> using namespace std; class Engineer{ protected: string name; // 姓名 int id; // 员工号 string phone; // 手机号码 public: Engineer(string n, int i, string p):name(n), id(i), phone(p){} virtual void Getsalary() = 0; // 纯虚函数 virtual void Print(){ cout << "姓名:" << name << endl; cout << "员工号:" << id << endl; cout << "手机号码:" << phone << endl; } }; class Manager:public Engineer{ private: int salary; // 月薪 public: Manager(string n, int i, string p, int s):Engineer(n, i, p), salary(s){} void Getsalary(){ cout << "月薪:" << salary << endl; } void Print(){ Engineer::Print(); // 调用基的Print函数 cout << "职位:经理" << endl; Getsalary(); // 调用本的Getsalary函数 } }; class Saleman:public Engineer{ private: int worktime; // 工作时间(小时) int salary; // 月薪 public: Saleman(string n, int i, string p, int t):Engineer(n, i, p), worktime(t){ salary = 700 + worktime * 25; } void Getsalary(){ cout << "月薪:" << salary << endl; } void Print(){ Engineer::Print(); cout << "职位:销售员" << endl; Getsalary(); } }; int main(){ Engineer *p; // 基指针 Manager m("张三", 1001, "13888888888", 5000); Saleman s("李四", 1002, "13999999999", 160); p = &m; // 指向Manager对象 p->Print(); // 调用Manager的Print函数 cout << endl; p = &s; // 指向Saleman对象 p->Print(); // 调用Saleman的Print函数 return 0; } ``` 输结果: ``` 姓名:张三 员工号:1001 手机号码:13888888888 职位:经理 月薪:5000 姓名:李四 员工号:1002 手机号码:13999999999 职位:销售员 月薪:3300 ``` 希望能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值