多态继承与派生

来源:互联网 发布:linux在目录下创建文件 编辑:程序博客网 时间:2024/06/06 01:47

/************************************************************************
**本程序功能:实现小型公司的工资管理,该公司主要有4类人员:经理、
**兼职技术人员、销售员和销售经理。要求存储这些人员的编号、姓名、
**月工资,计算月工资并显示全部信息,经理拿固定月薪8K,兼职技术人员按每小时
**100元领月薪,销售员当月销售额4%提成,销售经理拿5K并提成所管辖部门当月销售
**总额的5%%.
***方法:本程序看起来比较复杂,其实分开解决是很简单的,首先定义一个职员的基
******** 类,然后实现兼职技术人员,在实现经理,然后在实现销售员与销售经理
**************************************************************************/
#include <iostream>
using namespace std;
class employee      //定义一个基类(包含6个成员)
{
protected:
    int Numb;       //存储职工编号
    char name[10];  //存储职工名字
    int salary;     //存储职工本月工资
public:
    employee()      //构造函数 获取职工编号和姓名
    {
        cout << "职工编号:";
        cin >> Numb;
        cout << "职工姓名:";
        cin >> name;
        salary = 0;
    }
    virtual void pay() {}//计算月工资
   virtual void disp() {}//显示全部信息(编号、姓名、月工资)
};
class manager:virtual public employee//为什么要用virtual ,不用报错,靠!
{
protected:
    double monthlypay;
public:
    manager() { monthlypay = 8000; }
    void pay() {salary = monthlypay; }
    void disp()
    {
        cout << "经理" << name << "(编号为" << Numb \
            << ")" << "本月工资:" << salary << endl;
    }
};
class technician:public employee//派生兼职技术人员
{
    double hourlyrate;//每小时的额度
    int workhours;/*月工作的小时数*/
public:
    technician() { hourlyrate = 100; }
    void pay()
    {
        cout << name << "本月工作时数:";/*获取工作时间计算工资*/
            cin >> workhours;
        salary = hourlyrate * workhours;
    }
    void disp()
    {
        cout << "兼职技术人员" << name << "(编号为" << Numb \
            << ")" << "本月工资" << salary << endl;
    }
};
class salesman:virtual public employee
{
protected:
    double commrate;
    double sales;
public:
    salesman() { commrate = 0.04;}
    void pay()
    {
        cout << name << "本月销售额:";
        cin >> sales;
        salary = sales * commrate;
    }
    void disp()
    {
        cout << "销售员" << name << "(编号为" << Numb \
            << ")" << "本月工资:" << salary << endl;
    }
};

class salesmanager:public manager,public salesman
{
public:
    salesmanager()
    {
        monthlypay = 5000;
        commrate = 0.005;
    }
    void pay()
    {
        cout << name << "所管部门月销售量:";
        cin >> sales;
        salary = monthlypay + commrate * sales;
    }
    void disp()
    {
        cout << "销售经理" << name << "(编号为" << Numb \
            << ")" << "本月工资:" << salary << endl;
    }
};
void main()
{
    manager m1;
    technician t1;
    salesman s1;
    salesmanager sm1;
    m1.pay();
    m1.disp();
    t1.pay();
    t1.disp();
    s1.pay();
    s1.disp();
    sm1.pay();
    sm1.disp();
}