我们已经知道类的静态成员变量为这个类的所有对象所共享,那么对于基类而言是一种什么样的情况呢?
如果一个基类有一个静态成员变量,则他的所有派生类的所有对象是不是也共享这同一个基类中的静态变量呢?带着这个疑问用代码实操了一下,答案是肯定的。
首先看基类的定义:
BaseClass.h
#pragma once
#include<iostream>
#include<vector>
#include<string>
class BaseClass
{
public:
void printStrings() const;
void addString(const std::string& istr);
private:
static std::vector<std::string> m_strVector;
};
BaseClass.cpp
#include "BaseClass.h"
std::vector<std::string> BaseClass::m_strVector;
void BaseClass::printStrings() const
{
for (auto cIter = this->m_strVector.cbegin();
cIter != this->m_strVector.cend(); ++cIter) {
std::cout << *cIter << " ";
}
std::cout << std::endl;
}
void BaseClass::addString(const std::string& istr)
{
this->m_strVector.push_back(istr);
}
接下来是派生类们:
DerivedClasses.h
#pragma once
#include "BaseClass.h"
class DerivedClassA : public BaseClass { };
class DerivedClassB : public BaseClass { };
class DerivedClassAC : public DerivedClassA { };
class DerivedClassACD : public DerivedClassAC { };
下面是验证代码及运行结果:
#include"DerivedClasses.h"
int main()
{
DerivedClassA dclsa;
DerivedClassB dclsb_1;
DerivedClassB dclsb_2;
DerivedClassAC dclsac;
DerivedClassACD dclsacd;
dclsa.addString("DerivedClassA");
dclsacd.printStrings();
std::cout << "----------------------------" << std::endl;
dclsb_1.addString("DerivedClassB(1)");
dclsb_2.printStrings();
std::cout << "----------------------------" << std::endl;
dclsb_2.addString("DerivedClassB(2)");
dclsb_1.printStrings();
std::cout << "----------------------------" << std::endl;
dclsac.addString("DerivedClassAC");
dclsac.printStrings();
std::cout << "----------------------------" << std::endl;
dclsacd.addString("DerivedClassACD");
dclsa.printStrings();
return 0;
}
代码输出:
DerivedClassA
----------------------------
DerivedClassA DerivedClassB(1)
----------------------------
DerivedClassA DerivedClassB(1) DerivedClassB(2)
----------------------------
DerivedClassA DerivedClassB(1) DerivedClassB(2) DerivedClassAC
----------------------------
DerivedClassA DerivedClassB(1) DerivedClassB(2) DerivedClassAC DerivedClassACD
在验证代码中,类名称字符串是按照派生类头文件中的声明顺序添加的,而用于打印静态数据成员字符串向量的派生类对象是随机指定的。可以看出,基类里的静态成员变量忠实地记录下了每一个派生类对象向其添加的字符串,并在任意时刻由所有派生类对象所共享。