基类和子类的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变量做出的改动都可以被这些函数正常接收和使用,因为它们所指的是同一存储空间的变量。