C++语言复习十 类的继承和派生 实例

 类的继承和派生 实例

继承关系:

----------------------------------------------

普通雇员---->(pubilc)兼职技术人员

-----------------------------------------------

普通雇员---->(virtual pubilc)推销员

------------------------------------------------

普通雇员---->(virtual pubilc)经理

-----------------------------------------------

---->推销员

普通雇员                      (pubilc)  ---->销售经理

                ---->经理    

-----------------------------------------------


#include<iostream.h>
#include<string.h>
//----------------------------------------------------------------------------
//类的定义
class employee    //普通雇员
{
protected:
	char	*name;
	int		individualEmpNo;   //个人编号
	int		grade;      //级别
	float	accumPay;     //月薪总额
	static	int employeeNo;  //本公司职员编号目前的最大值

public:
	employee();  //构造函数
	~employee();    //析构函数
	void pay();     //计算月薪函数
	void promote(int);    //升级函数
	void displayStatus();    //显示人员信息
};

class technician: public employee      //兼职技术人员类
{
private:
	float	hourlyRate;    //每小时酬金
	int		workHours;      //当月工作时数
public:
	technician();      //构造函数
	void pay();        //计算月薪函数
	void displayStatus();    //显示人员信息
};

class salesman: virtual public employee      //推销员类
{
protected:
	float CommRate;    //按销售额提取酬金的百分比
	float sales;       //当月销售额
public:
	salesman();
	void pay();
	void displayStatus();   //显示人员信息
};

class manager:virtual public employee    //经理类
{
protected:
	float monthlyPay;  //固定月薪数
public:
	manager();
	void pay();
	void displayStatus();
};

class salesmanager:public manager,public salesman    //销售经理类
{
public:
	salesmanager();
	void pay();
	void displayStatus();    //显示人员信息

};

//---------------------------------------------------------------------------------------
//类的实现
int employee::employeeNo = 1000;  //员工编号基数10000

employee::employee()
{
	char namestr[50];      //输入雇员的姓名临时存放在namestr中
	cout<<"请输入一个雇员的姓名:";
	cin>>namestr;
	name = new char[strlen(namestr)+1];    //动态申请用于存放的内存空间
	strcpy(name,namestr);					//将临时存放的姓名复制到name
	individualEmpNo = employeeNo++;          //新输入的员工,其编号为目前最大编号加1
	grade = 1;               //级别初值为1
	accumPay = 0.0;           //月薪总额初值为0
}

employee::~employee()
{
	delete name;          //在析构函数中删除为存放姓名动态分配的内存空间
}

void employee::pay ()   //计算月薪
{
}

void employee::promote (int increment)
{
	grade+=increment;       //升级,提升的级数由increment指定
}

void employee::displayStatus ()     //显示人员信息,空函数
{
}

technician::technician()
{
	hourlyRate = 100;  //每小时酬金100
}

void technician::pay()
{
	cout<<"请输入"<<name<<"本月的工作时数:";
	cin>>workHours;
	accumPay = hourlyRate*workHours;//计算月薪。按小时计算
	cout<<"兼职技术人员:"<<name<<"编号:"<<individualEmpNo<<"本月工资"<<accumPay<<endl;
}

void technician::displayStatus ()
{
	cout<<"兼职技术人员:"<<name<<"编号:"<<individualEmpNo
			<<"级别为"<<grade<<"级,以付本月工资"<<accumPay<<endl;
}

salesman::salesman()
{
	CommRate = 0.04f;   //销售提成比例4%
}

void salesman::pay ()
{
	cout<<"请输入"<<name<<"本月销售额";
	cin>>sales;
	accumPay = sales*CommRate;  //月薪=销售提成
	cout<<"推销员:"<<name<<"编号:"<<individualEmpNo<<"本月工资"<<accumPay<<endl;
}

void salesman::displayStatus ()
{
	cout<<"推销员:"<<name<<"编号:"<<individualEmpNo<<"级别为"<<grade
				<<"级,已付本月工资"<<accumPay<<endl;
}

manager::manager()
{
	monthlyPay = 8000;  //固定月薪
}

void manager::pay ()
{
	accumPay = monthlyPay;     //月薪总额即固定月薪数
	cout<<"经理:"<<name<<"编号:"<<individualEmpNo
					<<"本月工资"<<accumPay<<endl;
}

void manager::displayStatus ()
{
	cout<<"经理:"<<name<<"编号:"<<individualEmpNo
					<<"级别为"<<grade<<"级,已付本月工资"<<accumPay<<endl;
}

salesmanager::salesmanager()
{
	monthlyPay = 5000;
	CommRate = 0.005f;
}

void salesmanager::pay()
{
	cout<<"请输入"<<employee::name<<"所管部门本月的销售总额";
	cin>>sales;
	accumPay = monthlyPay+CommRate*sales;//月薪=固定月薪 +销售提成
	cout<<"销售经理:"<<name<<"编号:"<<individualEmpNo
		<<"本月工资"<<accumPay<<endl;
}

void salesmanager::displayStatus ()
{
	cout<<"销售经理:"<<name<<"编号:"<<individualEmpNo
				<<"级别为"<<grade<<"级,已付本月工资"<<accumPay<<endl;
}

//-----------------------------------------------------------------
//主函数
int main()
{
	manager m1;      //定义一个经理m1
	technician t1;   //定义一个兼职技术人员t1
	salesmanager sm1;//定义一个销售经理sm1
	salesman s1;     //定义一个推销员s1

	m1.promote(3);
	m1.pay ();
	m1.displayStatus ();

	t1.promote (2);
	t1.pay ();
	t1.displayStatus ();

	sm1.promote (2);
	sm1.pay ();
	sm1.displayStatus ();

	s1.pay();
	s1.displayStatus ();

	return 0;
}

//----------------------------------------------------------------------


某次运行结果:(红色框是cin的数据。)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值