C++继承与派生问题

题目:

创建一个表示雇员信息的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来计算他们的月薪。

代码:

//177 第3题 
#include<iostream>
#include<string>
using namespace std;

class employee{
	public:
		virtual void pay()=0; 
		void output();
		employee(){
			name="noname";empNo=0;salary=0.0;
		}
		employee(string name,int empNo){
			this->name=name;
			this->empNo=empNo;
		}
		~employee(){}
	protected:
		string name;
		int empNo;
		float salary;
	
}; 
void employee :: output(){
	cout<<"名字:"<<name<<" 工号:"<<empNo<<" 月薪:"<<salary<<endl; 
} 

class worker : public employee{
	public:
		worker(string name,int empNo,int productNum):employee(name,empNo){
			this->productNum=productNum;
		}
		~worker(){}
		void pay(){
			salary = productNum*proper*0.2;
		}
	private:
		int productNum;
		static float proper;//每件产品利润 
};
float worker :: proper=20;//假设每件产品的利润 

class technician : public employee{
	public:
		technician(string name,int empNo,int workHours):employee(name,empNo){
			this->workHours=workHours;
		}
		~technician(){}
		void pay(){
			salary= workHours*payperhour;
		}
	private:
		int workHours;
		static float payperhour;//每小时酬金 	
};
float technician :: payperhour=40;//假设每小时酬金 

class salesman : public employee{
	public:
		salesman(string name,int empNo,int monthlysales):employee(name,empNo){
			this->monthlysales=monthlysales;
		}
		~salesman(){}
		void pay(){
			salary=monthlysales*percent; 
		}
	private:
		int monthlysales;
		static float percent;//销售人员的销售提成 
};
float salesman :: percent=0.5;//假设销售提成

int main(){
	employee * emp;
	emp=new worker("张三",1001,3000);
	emp->pay();
	emp->output();
	emp=new technician("李四",1002,4000);
	emp->pay();
	emp->output();
	emp=new technician("王五",1003,5000);
	emp->pay();
	emp->output();
	return 0;	
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值