类的继承和派生 实例
继承关系:
----------------------------------------------
普通雇员---->(pubilc)兼职技术人员
-----------------------------------------------
普通雇员---->(virtual pubilc)推销员
------------------------------------------------
普通雇员---->(virtual pubilc)经理
-----------------------------------------------
---->推销员
普通雇员 (pubilc) ---->销售经理
---->经理
-----------------------------------------------
#include<iostream.h>
#include<string.h>
//----------------------------------------------------------------------------
//类的定义
class employee //普通雇员
{
protected:
char *name;
int individualEmpNo; //个人编号
int grade; //级别
float accumPay; //月薪总额
static int employeeNo; //本公司职员编号目前的最大值
public:
employee(); //构造函数
~employee(); //析构函数
void pay(); //计算月薪函数
void promote(int); //升级函数
void displayStatus(); //显示人员信息
};
class technician: public employee //兼职技术人员类
{
private:
float hourlyRate; //每小时酬金
int workHours; //当月工作时数
public:
technician(); //构造函数
void pay(); //计算月薪函数
void displayStatus(); //显示人员信息
};
class salesman: virtual public employee //推销员类
{
protected:
float CommRate; //按销售额提取酬金的百分比
float sales; //当月销售额
public:
salesman();
void pay();
void displayStatus(); //显示人员信息
};
class manager:virtual public employee //经理类
{
protected:
float monthlyPay; //固定月薪数
public:
manager();
void pay();
void displayStatus();
};
class salesmanager:public manager,public salesman //销售经理类
{
public:
salesmanager();
void pay();
void displayStatus(); //显示人员信息
};
//---------------------------------------------------------------------------------------
//类的实现
int employee::employeeNo = 1000; //员工编号基数10000
employee::employee()
{
char namestr[50]; //输入雇员的姓名临时存放在namestr中
cout<<"请输入一个雇员的姓名:";
cin>>namestr;
name = new char[strlen(namestr)+1]; //动态申请用于存放的内存空间
strcpy(name,namestr); //将临时存放的姓名复制到name
individualEmpNo = employeeNo++; //新输入的员工,其编号为目前最大编号加1
grade = 1; //级别初值为1
accumPay = 0.0; //月薪总额初值为0
}
employee::~employee()
{
delete name; //在析构函数中删除为存放姓名动态分配的内存空间
}
void employee::pay () //计算月薪
{
}
void employee::promote (int increment)
{
grade+=increment; //升级,提升的级数由increment指定
}
void employee::displayStatus () //显示人员信息,空函数
{
}
technician::technician()
{
hourlyRate = 100; //每小时酬金100
}
void technician::pay()
{
cout<<"请输入"<<name<<"本月的工作时数:";
cin>>workHours;
accumPay = hourlyRate*workHours;//计算月薪。按小时计算
cout<<"兼职技术人员:"<<name<<"编号:"<<individualEmpNo<<"本月工资"<<accumPay<<endl;
}
void technician::displayStatus ()
{
cout<<"兼职技术人员:"<<name<<"编号:"<<individualEmpNo
<<"级别为"<<grade<<"级,以付本月工资"<<accumPay<<endl;
}
salesman::salesman()
{
CommRate = 0.04f; //销售提成比例4%
}
void salesman::pay ()
{
cout<<"请输入"<<name<<"本月销售额";
cin>>sales;
accumPay = sales*CommRate; //月薪=销售提成
cout<<"推销员:"<<name<<"编号:"<<individualEmpNo<<"本月工资"<<accumPay<<endl;
}
void salesman::displayStatus ()
{
cout<<"推销员:"<<name<<"编号:"<<individualEmpNo<<"级别为"<<grade
<<"级,已付本月工资"<<accumPay<<endl;
}
manager::manager()
{
monthlyPay = 8000; //固定月薪
}
void manager::pay ()
{
accumPay = monthlyPay; //月薪总额即固定月薪数
cout<<"经理:"<<name<<"编号:"<<individualEmpNo
<<"本月工资"<<accumPay<<endl;
}
void manager::displayStatus ()
{
cout<<"经理:"<<name<<"编号:"<<individualEmpNo
<<"级别为"<<grade<<"级,已付本月工资"<<accumPay<<endl;
}
salesmanager::salesmanager()
{
monthlyPay = 5000;
CommRate = 0.005f;
}
void salesmanager::pay()
{
cout<<"请输入"<<employee::name<<"所管部门本月的销售总额";
cin>>sales;
accumPay = monthlyPay+CommRate*sales;//月薪=固定月薪 +销售提成
cout<<"销售经理:"<<name<<"编号:"<<individualEmpNo
<<"本月工资"<<accumPay<<endl;
}
void salesmanager::displayStatus ()
{
cout<<"销售经理:"<<name<<"编号:"<<individualEmpNo
<<"级别为"<<grade<<"级,已付本月工资"<<accumPay<<endl;
}
//-----------------------------------------------------------------
//主函数
int main()
{
manager m1; //定义一个经理m1
technician t1; //定义一个兼职技术人员t1
salesmanager sm1;//定义一个销售经理sm1
salesman s1; //定义一个推销员s1
m1.promote(3);
m1.pay ();
m1.displayStatus ();
t1.promote (2);
t1.pay ();
t1.displayStatus ();
sm1.promote (2);
sm1.pay ();
sm1.displayStatus ();
s1.pay();
s1.displayStatus ();
return 0;
}
//----------------------------------------------------------------------
某次运行结果:(红色框是cin的数据。)