用C++ 纯虚函数 继承 完成 工资计算

题目条件:公司有四种职位 经理(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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值