//公司有四種職位 經理(Manager) 技術人員(Technician) 銷售(SaleMan) 銷售經理(SaleManager) //每增加一個人,工號加1 //薪資:經理 8000 技術人員
阿新 • • 發佈:2019-02-16
//公司有四種職位 經理(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; }
執行結果: