题目条件:公司有四种职位 经理(Manager) 技术人员(Technician) 销售人员(SaleMan) 销售经理(SaleManager)
每增加一个人,工号加一;
薪资:经理 8000 技术人员300一天 销售 自己的总额*0.04 销售经理:销售人员总额*0.02+4000
分析:我们可以创建一个基类,经理和技术人员分别虚继承(公有继承)基类 而销售经理同时继承经理类和销售类
代码实现如下:
people.h
#ifndef _PEOPLE_H_
#define _PEOPLE_H_
#include <cstring>
#include <iostream>
using namespace std;
class People
{
protected:
string m_name;
static int num;
int m_id;
double m_salary;
public:
People();
virtual double set_salary() = 0;
virtual void get_message() = 0;
};
class Manager : virtual public People
{
protected:
int m_base;
public:
Manager(string n,int b);
double set_salary();
void get_message();
};
class Technician : public People
{
protected:
int m_day;
public:
Technician(string n,int d);
double set_salary();
void get_message();
};
class SaleMan : virtual public People
{
protected:
int m_sale;
static int sale_sum;
public:
SaleMan(string n,int s);
double set_salary();
void get_message();
};
class SaleManager :public Manager,public SaleMan
{
public:
SaleManager(string n);
double set_salary();
void get_message();
};
#endif
people.cpp
#include "people.h"
#include <iostream>
using namespace std;
int People::num = 0;
int SaleMan::sale_sum = 0;
People::People()
{
num++;
m_id = num;
}
Manager::Manager(string n,int b = 8000)
{
m_name = n;
m_base = b;
}
double Manager::set_salary()
{
m_salary = m_base;
return m_salary;
}
void Manager::get_message()
{
cout << "名字 " << m_name << " 工号 " << m_id << " 工资 " << set_salary() << endl;
}
Technician::Technician(string n,int d)
{
m_day = d;
m_name = n;
}
double Technician::set_salary()
{
m_salary = m_day * 300;
return m_salary;
}
void Technician::get_message()
{
cout << "名字 " << m_name << " 工号 " << m_id << " 工资 " << set_salary() << endl;
}
SaleMan::SaleMan(string n,int s = 0)
{
m_name = n;
m_sale = s;
sale_sum = sale_sum + m_sale;
}
double SaleMan::set_salary()
{
m_salary = m_sale * 0.04;
return m_salary;
}
void SaleMan::get_message()
{
cout << "名字 " << m_name << " 工号 " << m_id << " 工资 " << set_salary() << endl;
}
SaleManager::SaleManager(string n) :SaleMan(n),Manager(n,4000)
{
}
double SaleManager::set_salary()
{
m_salary = sale_sum * 0.02 + m_base;
return m_salary;
}
void SaleManager::get_message()
{
cout << "名字 " << m_name << " 工号 " << m_id << " 工资 " << set_salary() << endl;
}
main.cpp
#include "people.h"
#include <iostream>
using namespace std;
int main()
{
srand(time(NULL));
People *pm = new Manager("aa",8000);
pm->get_message();
char name[20] = {0};
People *pt[5] = {0};
People *ps[10] = {0};
People *psm = NULL;
for(int i=0;i<5;i++)
{
sprintf(name,"Technician%d",i+1);
pt[i] = new Technician(name,rand() % 23);
pt[i]->get_message();
}
for(int i=0;i<10;i++)
{
sprintf(name,"SaleMan%d",i+1);
ps[i] = new SaleMan(name,rand() % 200000);
ps[i]->get_message();
}
psm = new SaleManager("jwj");
psm->get_message();
return 0;
}
运行结果:
名字 aa 工号 1 工资 8000
名字 Technician1 工号 2 工资 3000
名字 Technician2 工号 3 工资 600
名字 Technician3 工号 4 工资 4800
名字 Technician4 工号 5 工资 6300
名字 Technician5 工号 6 工资 2100
名字 SaleMan1 工号 7 工资 853
名字 SaleMan2 工号 8 工资 7851.48
名字 SaleMan3 工号 9 工资 4860.56
名字 SaleMan4 工号 10 工资 5262.72
名字 SaleMan5 工号 11 工资 4877.36
名字 SaleMan6 工号 12 工资 5587.36
名字 SaleMan7 工号 13 工资 5410.16
名字 SaleMan8 工号 14 工资 3944.08
名字 SaleMan9 工号 15 工资 4085.68
名字 SaleMan10 工号 16 工资 5956.68
名字 jwj 工号 17 工资 28344.5