所有派生类共享的基类中是否有静态variables?
如果我有类似的东西
class Base { static int staticVar; } class DerivedA : public Base {} class DerivedB : public Base {}
DerivedA
和DerivedB
共享相同的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> {};
你的情况只有一个staticVar
: Base::staticVar
当你在一个类中声明一个静态variables的时候,这个variables是为那个类声明的。 在你的情况下,DerivedA甚至不能看到staticVar
(因为它是私有的,不受保护或公共的),所以它甚至不知道存在staticVar
variables。
他们将共享相同的实例。
您需要为每个子类声明单独的静态variables,或者您可以考虑一个简单的静态映射,您可以在其中存储由派生类引用的variables。
编辑 :一个可能的解决scheme是将您的基类定义为模板。 在这个模板中定义一个静态variables意味着每个派生类将拥有它自己的静态实例。