//公司有四种职位 经理(Manager) 技术人员(Technician) 销售(SaleMan) 销售经理(SaleManager) //每增加一个人,工号加1 //薪资:经理 8000 技术人员

//公司有四种职位 经理(Manager) 技术人员(Technician) 销售(SaleMan) 销售经理(SaleManager)
//每增加一个人,工号加1
//薪资:经理 8000 技术人员 300/天 销售 总额*4% 销售经理 部门销售额*2%+4000
 

#include<iostream>
#include<string.h>
using namespace std;
static int num=0;    //静态全局变量,num为总员工数 
static double m_sum; //m_sum为所有销售人员销售的总销售额 

class Company
{
	protected:
		string m_name;  //姓名 
		int m_id;    //工号 
	public:
		Company();   //构造函数 
		virtual double get()=0;   //纯虚函数 ,打印信息 
};
Company::Company()
{
	num++;
	m_id=num;      //令工号从1开始计; 
}


class Manager:virtual public Company    //虚继承 
{
	protected:
		double m_salary;
	public:
		Manager(string name,double salary);
		double get();    //打印信息 
};
Manager::Manager(string name,double salary=8000)    //带默认参数的构造函数,默认参数必须放在函数的最后 
{
	m_name=name;
	m_salary=salary;
//	num++;
}
double Manager ::get() 
{
	cout<<"manager's name: "<<m_name;
	cout<< "\t\tsalary: "<<m_salary;
	cout<<"\t\tid: "<<m_id<<endl;
}


class Technician:public Company
{
	protected:
		int m_day;
	public:
		Technician(string name,int day);
		double get();
};
Technician::Technician(string name,int day)
{
	m_day=day;
	m_name=name;
//	num++;    原来的程序是在每个构造函数中加上num++用来计数,但这样太麻烦,而且也不方便对工号赋值
//            所以把num改成静态全局变量。用company构造函数对num计数 
}

double Technician::get()
{
	cout<<"Technician's name: "<<m_name;
	cout<<"\t\tsalary: "<<m_day*300;
	cout<<"\t\tid: "<<m_id<<endl;

}
class SaleMan :virtual public Company
{
	
	protected:
		double m_sale;
	public:
		SaleMan(string name,double sale);
		double get();
};
SaleMan::SaleMan(string name,double sale=0)
{
	m_sale=sale;
	m_name=name;
	m_sum+=m_sale;
//	num++;	
}
double SaleMan::get()
{
	cout<<"SlaeMan's name: "<<m_name;	
	cout<<"\t\tsalary: "<<m_sale*0.04;
	cout<<"\t\tid: "<<m_id<<endl;
//	cout<<m_sum<<endl;              这边原来是用来查看m_sum是否被赋值。用来检错。 
}
class SaleManager : public  Manager,public SaleMan
{
	public:
		SaleManager(string name);
		double get();
};
SaleManager::SaleManager(string name):SaleMan(name),Manager(name,4000)
{
//	m_salary=salary;    原来声明salemanager为3个变量的构造函数 ,没有1个变量的简洁方便。 
//	m_sale=sale;       
//	m_name=name;
}
double SaleManager::get()
{
	m_salary= m_salary+m_sum*0.02;
//	cout<<m_sum<<endl;    用来检查m_sum传值是否正确。
//                        原来的程序没有把m_sum声明为静态全局变量,导致m_sum的值并不能传到salemanager类中,打印出的工资为4000,显然不对。 
	cout<<"SaleManager's name: "<<m_name;
	cout<<"\t\tsalary: "<< m_salary;
	cout<<"\t\tid: "<<m_id<<endl;
	
}
int main()
{

	Manager m ("liyy");    //Company  *m = new Manager("liyy",8000) 
	m.get();               //m->get();             另一种写法; 
	SaleMan s ("limo",23223);
	s.get();
	SaleManager sm("dee");
	sm.get();
/*	srand(time(NULL));             这段注释掉的内容,在一些编译器上编译不通过。在虚拟机上可以编译通过 
	char name[20] = {0};           内容大概是:声明5个技术人员,10个销售人员,随机分配技术人员工作的天数, 
	Company *pt[5] = {0};                      随机分配销售人员销售的销售额 
	Company *ps[10] = {0};
	for (int i = 0; i < 5; i++)
	{
		sprintf(name, "Technician%d", i);
		pt[i] = new Technician(name, rand() % 22 + 1);    +1是为了防止出现工资为0的情况 
		pt[i]->get();
	}

	for (int i = 0; i < 10; i++)
	{
		sprintf(name, "S%d", i);
		ps[i] = new SaleMan(name, rand() % 200000);
		ps[i]->get();
	}
*/
	cout<<"总员工数:"<<num<<endl;

	return 0;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/mmmmmmyy/article/details/81292462