所有派生类共享的基类中是否有静态variables?

如果我有类似的东西

class Base { static int staticVar; } class DerivedA : public Base {} class DerivedB : public Base {} 

DerivedADerivedB共享相同的DerivedA DerivedB吗?还是他们各自拥有?

如果我希望他们每个人都有自己的,你会推荐我做什么?

它们将分别共享同一个staticVar实例。

为了让每个派生类获得它们自己的静态variables,你需要声明另一个具有不同名字的静态variables。

然后,您可以在您的基类中使用一对虚拟函数来获取和设置variables的值,并在每个派生类中重写该对以获取和设置该类的“本地”静态variables。 或者,您可以使用一个函数返回一个引用:

 class Base { static int staticVarInst; public: virtual int &staticVar() { return staticVarInst; } } class Derived: public Base { static int derivedStaticVarInst; public: virtual int &staticVar() { return derivedStaticVarInst; } } 

您将然后使用这个:

 staticVar() = 5; cout << staticVar(); 

为了确保每个类都有它自己的静态variables,你应该使用“好奇复发模板模式”(CRTP) 。

 template <typename T> class Base { static int staticVar; }; template <typename T> int Base<T>::staticVar(0); class DerivedA : public Base<DerivedA> {}; class DerivedB : public Base<DerivedB> {}; 

你的情况只有一个staticVarBase::staticVar

当你在一个类中声明一个静态variables的时候,这个variables是为那个类声明的。 在你的情况下,DerivedA甚至不能看到staticVar (因为它是私有的,不受保护或公共的),所以它甚至不知道存在staticVarvariables。

他们将共享相同的实例。

您需要为每个子类声明单独的静态variables,或者您可以考虑一个简单的静态映射,您可以在其中存储由派生类引用的variables。


编辑 :一个可能的解决scheme是将您的基类定义为模板。 在这个模板中定义一个静态variables意味着每个派生类将拥有它自己的静态实例。