忄真 Ꮤ 2021-06-04 14:14 采纳率: 66.7%
浏览 11
已采纳

求大佬看看,为什么第一个name会被第二个name覆盖

#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;

}

 

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-06-04 14:33
    关注

    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>

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料