1. 程式人生 > >//公司有四種職位 經理(Manager) 技術人員(Technician) 銷售(SaleMan) 銷售經理(SaleManager) //每增加一個人,工號加1 //薪資:經理 8000 技術人員

//公司有四種職位 經理(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;
}

執行結果: