#include<iostream>
#include<string.h>
using namespace std;
//在此补全雇员类(Employee)、推销人员类(Salesman)和技术人员类(Tech )的相关代码
class Emplore
{
public:
char *name;
int num;
float salary;
public:
char* getna()
{
return name;
}
int getnum()
{
return num;
}
int getsa()
{
return salary;
}
Emplore(){}
Emplore(char *name1,int num1)
{
name=new char[10];
name=name1;
num=num1;
}
Emplore(const Emplore &e)
{
name=e.name;
num=e.num;
}
virtual void print()
{
}
virtual void Pay()
{
}
};
class Salesman :public Emplore
{
public:
float ti;
float mon;
Salesman(){}
Salesman(char* na,int no,float rate,float sales):Emplore(na,no)
{
ti=rate;
mon=sales;
}
void Pay()
{
salary=ti*mon;
}
void print()
{
cout<<"name="<<getna()<<","<<"NO="<<getnum()<<","<<"wages="<<getsa()<<","<<"rate="<<ti<<","<<"sales="<<mon<<endl;
}
Salesman(const Salesman& s)
{
ti=s.ti;
mon=s.mon;
}
};
class Tech :public Emplore
{
public:
float rate1;
float hour;
Tech(){}
Tech (char* na1,int no,float rate,float sales):Emplore(na1,no)
{
rate1=rate;
hour=sales;
}
void Pay()
{
salary=hour*rate1;
}
void print()
{
cout<<"name="<<getna()<<","<<"NO="<<getnum()<<","<<"wages="<<getsa()<<","<<"hourRate="<<rate1<<","<<"workHours="<<hour<<endl;
}
Tech(const Tech& t)
{
rate1=t.rate1;
hour=t.hour;
}
};
void fun(Emplore& ref)
{
ref.Pay();
ref.print();
cout<<endl;
}
int main()
{
char name[10];
int NO;
float rate, sales;
cin>>name>>NO>>rate>>sales;
Salesman s(name,NO,rate,sales);
float hourRate,workHours;
cin>>name>>NO>>hourRate>>workHours;
Tech t(name,NO,hourRate,workHours);
fun(s);
fun(t);
return 1;
}
Emplore(char *name1,int num1)
{name=new char[10];
name=name1;
num=num1;}
这个构造函数,这么写就意味着,你所有的Emplore的子类的name都指向name1的地址(也就是main函数中的char name[10];这个name的地址),所以所有子类的name都是一样的,因为它们都指向同一个地址。
正确的写法是:
Emplore(char *name1,int num1)
{int len = strlen(name1);
name=new char[len+1];
memset(name,0,len+1);
memcpy(name,name1,strlen(name1);}
析构函数中要删除申请的空间:
~Emplore()
{
if(name) {delete[] name;name=0;}
}
同时,无参构造函数也需要改一下:
Emplore(){name = 0;}
需要包含头文件#include <string>