本次学习王老师的课件至day9然后打算实现自己企业员工信息管理系统:
一个小型公司的人员信息管理系统
某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水.计算月薪总额并显示全部信息。人员编号基数为 1000,每输入一个人员信息编号顺序加 1。程序要有对所有人员提升级别的功能。 本例中为简单起见, 所有人员的初始级别均为 1级。然后进行升级,经理升为 4 级,技术人员和销售经理升为 3 级,推销员仍为 1 级。月薪计算办法是: 经理拿固定月薪 8000 元; 技术人员按每小时 100 元领取月薪; 推销员的月薪按该推销员当月销售额的 4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售总额的 5%。
类设计以及分析:
有了各类的成员以及函数,实现起来就容易了。
先看父类的实现父类里面都是用的纯虚函数,提供接口:
class Emp_class
{
public:
Emp_class(string emp_name = "");
virtual ~Emp_class();
virtual void cala_salary() = 0;
virtual void print_info() = 0;
virtual void grade_pro() = 0;
protected:
string name;
int grade;
double mont_salary;
static int num;
private:
};
int Emp_class::num = 1000;
Emp_class::Emp_class(string emp_name)
{
cout<<"------------------"<<endl;
cout<<"请输入"<<emp_name<<"员工姓名:"<<endl;
cin>>name;
num++;
}
Emp_class::~Emp_class()
{
cout<<"~Emp_class"<<endl;
}
然后实现Mang_class,这里的话来一个虚继承:
class Mang_class:virtual public Emp_class
{
public:
Mang_class();
~Mang_class();
void cala_salary();
void print_info();
void grade_pro();
protected:
double fmont_salary;
private:
int num_pri;
};
Mang_class::Mang_class()
:Emp_class("经理"),fmont_salary(8000),num_pri(num)
{
}
Mang_class::~Mang_class()
{
cout<<"~Mang_class"<<endl;
}
void Mang_class::cala_salary()
{
mont_salary = fmont_salary;
}
void Mang_class::print_info()
{
cout<<"-------经理------"<<endl;
cout<<"经理姓名:"<<name<<endl;
cout<<"经理编号:"<<num_pri<<endl;
cout<<"经理级别:"<<grade<<endl;
cout<<"经理薪水:"<<mont_salary<<endl;
cout<<"-------经理------"<<endl;
}
然后实现sale_class:
class Sale_class:virtual public Emp_class
{
public:
Sale_class();
~Sale_class();
void cala_salary();
void print_info();
void grade_pro();
protected:
int sale_amounts;
double per_salary;
private:
int num_pri;
};
Sale_class::Sale_class()
:Emp_class("销售"),per_salary(0.04),num_pri(num)
{
cout<<"请输入销售额:"<<endl;
cin>>sale_amounts;
}
Sale_class::~Sale_class()
{
cout<<"~Sale_class"<<endl;
}
void Sale_class::cala_salary()
{
mont_salary = sale_amounts*per_salary;
}
void Sale_class::print_info()
{
cout<<"-------销售人员------"<<endl;
cout<<"销售人员姓名:"<<name<<endl;
cout<<"销售人员编号:"<<num_pri<<endl;
cout<<"销售人员级别:"<<grade<<endl;
cout<<"销售人员薪水:"<<mont_salary<<endl;
cout<<"-------销售人员------"<<endl;
}
void Sale_class::grade_pro()
{
grade = 3;
}
然后实现salemang_class,这个类公有继承前边两个类:
class SaleMang_class:public Sale_class,public Mang_class
{
public:
SaleMang_class();
~SaleMang_class();
void cala_salary();
void print_info();
void grade_pro();
protected:
private:
int num_pri;
};
SaleMang_class::SaleMang_class()
:Emp_class("销售经理"),Sale_class(),Mang_class(),num_pri(num)
{
per_salary = 0.05;
fmont_salary = 5000;
}
SaleMang_class::~SaleMang_class()
{
cout<<"~SaleMang_class"<<endl;
}
void SaleMang_class::cala_salary()
{
mont_salary =fmont_salary + sale_amounts*per_salary;
}
void SaleMang_class::print_info()
{
cout<<"-------销售经理------"<<endl;
cout<<"销售经理姓名:"<<name<<endl;
cout<<"销售经理编号:"<<num_pri<<endl;
cout<<"销售经理级别:"<<grade<<endl;
cout<<"销售经理薪水:"<<mont_salary<<endl;
cout<<"-------销售经理------"<<endl;
}
void SaleMang_class::grade_pro()
{
grade = 3;
}
最后实现tech_class类:
class Tech_class:public Emp_class
{
public:
Tech_class();
~Tech_class();
void cala_salary();
void print_info();
void grade_pro();
protected:
double work_hours;
const int hout_salary;
private:
int num_pri;
};
Tech_class::Tech_class()
:Emp_class("技术"),hout_salary(100),num_pri(num)
{
cout<<"请输入工作小时数:"<<endl;
cin>>work_hours;
}
Tech_class::~Tech_class()
{
cout<<"~Tech_class"<<endl;
}
void Tech_class::cala_salary()
{
mont_salary = work_hours*hout_salary;
}
void Tech_class::print_info()
{
cout<<"--------技术人员------"<<endl;
cout<<"技术人员姓名:"<<name<<endl;
cout<<"技术人员编号:"<<num_pri<<endl;
cout<<"技术人员级别:"<<grade<<endl;
cout<<"技术人员薪水:"<<mont_salary<<endl;
cout<<"--------技术人员------"<<endl;
}
void Tech_class::grade_pro()
{
grade = 3;
}
好到这里各类的实现就完成了,下面建立main_emp来进行调用:
Emp_class *p[] = {new Tech_class,new Mang_class,new Sale_class,new SaleMang_class};
for (int i = 0;i<sizeof(p)/sizeof(p[0]);i++)
{
p[i]->cala_salary();
p[i]->grade_pro();
p[i]->print_info();
}
for (int i = 0;i<sizeof(p)/sizeof(p[0]);i++)
{
delete p[i];
}
输出结果如下:
哈哈,成了,然后下边还看到了一个有意思的东西,叫typeid和dynamic_cast ,它们是 C++ 运行时类型信息 RTTI(run time type identificaiton)重要组成部分。运行时信息,来自于多态,所以以下运算符只用于基于多态的继承体系中。
例如,假如我们看胡月她男朋友表现勤奋,要给他加工资,怎么加呢?
改下主函数以及给salemang_class类添加一个成员函数就可以了,哈哈,到此结束。拜拜。 Emp_class *p[] = {new Tech_class,new Mang_class,new Sale_class,new SaleMang_class};
for (int i = 0;i<sizeof(p)/sizeof(p[0]);i++)
{
if (typeid(*p[i]) == typeid(SaleMang_class) )
{
SaleMang_class* ps =dynamic_cast<SaleMang_class*>(p[i]);
ps->salary_pro(10000);
}
p[i]->cala_salary();
p[i]->grade_pro();
p[i]->print_info();
}
for (int i = 0;i<sizeof(p)/sizeof(p[0]);i++)
{
delete p[i];
}
欢迎一起讨论,谢谢观看!
代码以及分析文件已经上传,可以去这里(https://download.csdn.net/download/qq_33268208/10463297)下载。