某学校教职工的工资计算方法为:
·所有教职工都有基本工资
·教师月工资等于固定工资+课时补贴,课时补贴根据职称和课时数计算。例如,每课时教授补贴50元,副教授补贴30元,讲师补贴20元
·管理人员月薪等于基本工资+职务工资
·实验室人员月薪等于基本工资+工作日补贴,工作日补贴等于日补贴*月工作日数
定义教职工抽象类,派生教师类、管理人员类和实验室人员类,编写程序测试这个类体系
这题其实是下一题的前置,为下一题做铺垫,打基础。
读题可知,教职工为抽象基类派生出另外三个类,所以很自然地想到虚函数。
为方便测试类体系,所以需要有输入输出两种成员函数,此外,计算工资还需要一个成员函数。
这题没有什么难点,直接上代码
// P266Ex2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
class Tworker
{
protected:
double baseSalary;
string name, number;
public:
Tworker(){
baseSalary = 3000;
cout << "请输入姓名:\n";
cin >> name;
cout << "请输入教职工编号\n";
cin >> number;
}
virtual double Salary() = 0;
virtual void input() = 0;
virtual void print() = 0;
};
class Teacher:public Tworker
{
protected:
double lsubsidy;
int lessennum;
int jobnum;
double* p;
public:
void print()
{
if(jobnum==1)
cout <<"job:教授\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary();
else if(jobnum==2)cout << "job:副教授\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary();
else if(jobnum==3)cout << "job:讲师\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary();
}
void input()
{
p = &lsubsidy;
cout << "请输入课时数:\n";
cin >> lessennum;
IN:cout << "请输入职称代码:(教授为1,副教授为2,讲师为3)\n";
cin >> jobnum;
if (jobnum == 1)*p = 50;
else if (jobnum == 2) *p = 30;
else if (jobnum == 3)*p = 20;
else { cout << "职称代码有误,请重新输入\n"; goto IN; }
}
double Salary()
{
return lsubsidy * lessennum + baseSalary;
}
};
class Manager:public Tworker
{
protected:double jobSalary;
public:void print()
{
cout << "job:管理人员\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary();
}
Manager()
{
jobSalary = 2500;
}
void input() { jobSalary = 2500; }
double Salary()
{
return jobSalary + baseSalary;
}
};
class Laber :public Tworker {
protected:double dsubsidy; int days;
public:
void print()
{
cout << "job:实验室人员\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary();
}double Salary() { return dsubsidy * days + baseSalary; }
Laber()
{
dsubsidy = 100;
}
void input()
{
cout << "请输入工作天数:\n";
cin >> days;
}
};
void Input(Tworker& tc)
{
tc.input();
}
void Print(Tworker& t)
{
cout << endl;
t.print();
cout << endl;
}
int main()
{
Teacher t;
t.input();
Manager m;
m.input();
Laber l;
l.input();
Print(t);
Print(m);
Print(l);
}
有前面的纯虚函数,重载的input函数和print函数通过形参表来决定在哪个对象上进行操作,简单快捷清晰明了