虚函数和多态性的简单应用,计算员工的工资
#include<iostream>
#include<cstring>
using namespace std;
class Employee
{protected:
char name[20];
int number;
double basicSalary;
public:
Employee(char*pn="\0",int num=0, double bs=0);
virtual void input();
double salary();
virtual void output();//用了虚函数的版本,突然发现自己记错了一个知识点,虚函数是可以在类外定义的在类内声明
};
class Salesman:public Employee
{protected:
double sales;
static double commrate;
public:
Salesman(char*pn="\0",int num=0, double bs=2000,double s=0);
void input();
double salary();
void output();
};
double Salesman::commrate=0.005;
class Salesmanager:public Salesman
{protected:
double jobSalary;
public:
Salesmanager(char*pn="\0",int num=0,double bs=2000,double s=0,double job=3000);
void input();
double salary();
void output();
};
Employee::Employee(char*pn,int num, double bs)
{
strcpy(name,pn);
number=num;
basicSalary=bs;
}
void Employee::input()
{
cout<<"please input the name: ";cin>>name;
cout<<"please input the number: ";cin>>number;
}
double Employee::salary()
{return basicSalary;}
void Employee::output()
{
cout<<"Employee:\nname: "<<name<<"\tnumber:"<<number<<"\tsalary: "<<salary()<<endl;
}
Salesman::Salesman(char*pn,int num,double bs,double s):Employee(pn,num,bs)
{sales=s;}
void Salesman::input()
{
Employee::input();
cout<<"please input the sales:";cin>>sales;
}
double Salesman::salary()
{return Employee::salary()+sales*commrate;}
void Salesman::output()
{cout<<"Salesman:\nname: "<<name<<"\tnumber:"<<number<<"\tsalary: "<<salary()<<endl;}
Salesmanager::Salesmanager(char*pn,int num, double bs,double s, double job):Salesman(pn,num,bs,s)
{jobSalary=job;}
void Salesmanager::input()
{
Salesman::input();
}
double Salesmanager::salary()
{return Salesman::salary()+jobSalary;}
void Salesmanager::output()
{ cout<<"Salesmanger:\nname: "<<name<<"\tnumber:"<<number<<"\tsalary: "<<salary()<<endl;
}
int main()
{
Employee e1("sunyucui",001),*p;
p=&e1;//多态性的实现利用的虚函数和基类指针
p->input();
p->output();
//e1.input();e1.output();
Salesman s1("sun",002,2000,20);
p=&s1;
p->input();
p->output();
//s1.input();s1.output();
Salesmanager s2("yucui",003,2000,50,3000);
p=&s2;
p->input();
p->output();
//s2.input();s2.output();
return 0;
}