基类和子类的static成员

基类和子类的static成员

  在类的继承中,如果基类具有static成员变量,那么子类将继承该static成员变量。在该成员变量的访问限定符为public或private时,子类可以访问该成员变量。且子类的该变量仍为静态变量,与基类该成员变量使用同一存储空间
  在人事管理系统程序(第一版)中,Salesman和Salemanager就是这样的继承关系。代码摘录如下:

class Salemanager;
class Salesman : virtual public Employee {
public:
	Salesman(std::string s, char c) :Employee(0, s, c),sales(0) {
		salesmanNum++;
		Grade = "salesman";
	}
	Salesman() {
		accumPay = 0;
		Grade = "salesman";
	};
	virtual int getsales() {
		return sales;
	}
	virtual void pp() ;
	virtual void plus(int i) ;
	virtual void minus(int i) ;
	virtual void equal(int i) ;
	virtual int Pay() {
		std::cout << accumPay << std::endl;
		return 0;
	}
	virtual void promote(int i) {
		accumPay += 2000 * i;
		salesmanPay += 2000 * i;
	}
	friend Salemanager;
	friend std::ostream& operator<<(std::ostream& os, Salesman& slm);
	friend void Upgrade(Salemanager& slmgr, Salesman& slm);
	friend void Output();
	virtual void putInfo(std::ostream& os) {
		os << "Name: " << name << std::endl
			<< "Sex: " << sex << std::endl
			<< "Grade: Salesman" << std::endl
			<< "Salary: " << accumPay;
	}
	~Salesman() { 
		salesmanNum--;
		salesmanPay = salesmanPay - accumPay;
	}
private:
	int sales;
	static int salesmanNum;
protected:
	static int salesmanPay;
};
class Salemanager :public Salesman, public Manager {
public:
	Salemanager(std::string s, char c) :Employee(0, s, c) {
		salesOfAll = salesmanPay * 5;
		salemanagerNum++;
		accumPay = 8000 + salesOfAll * 0.04;
		salemanagerPay += accumPay;
		Grade = "salemanager";
	}
	Salemanager(Salesman &slm) {
		name = slm.name;
		sex = slm.sex;
		salesOfAll = salesmanPay * 5;
		salemanagerNum++;
		accumPay = 8000 + salesOfAll * 0.04;
		salemanagerPay += accumPay;
		Grade = "salemanager";
	}
	Salemanager() {
		salesOfAll = salesmanPay * 5;
		salemanagerNum++;
		accumPay = 8000 + salesOfAll * 0.04;
		salemanagerPay += accumPay;
		Grade = "salemanager";
	}
	virtual int Pay() {
		std::cout << accumPay << std::endl;
		return 0;
	}
	virtual void promote(int) {
		salesOfAll = salesmanPay * 5;
		salemanagerPay += 4000;
		accumPay += 4000;
	}
	friend void Upgrade(Salemanager& slmgr, Salesman& slm);
	friend std::ostream& operator<<(std::ostream& os, Salemanager& slm);
	friend void Output();
	void update() {//更新本对象的数据
		int beyond = accumPay - (8000 + salesOfAll * 0.04);
		int Pay = accumPay;
		salesOfAll = salesmanPay * 5;
		accumPay = beyond + 8000 + salesOfAll * 0.04;
		salemanagerPay += (accumPay - Pay);
	}
	virtual void putInfo(std::ostream& os) {
		os << "Name: " << name << std::endl
			<< "Sex: " << sex << std::endl
			<< "Grade: Salemanager" << std::endl
			<< "Salary: " << accumPay;
	}
private:
	static int salesOfAll;//初始化在Employee.cpp中
	static int salemanagerNum;
	static int salemanagerPay; //初始化在Employee.cpp中
};

  可以看到在Salemanager的构造函数和成员函数中调用了Salesman类的static变量。此时程序对Salesman类的static变量做出的改动都可以被这些函数正常接收和使用,因为它们所指的是同一存储空间的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值