基类中的静态变量是否由所有派生类共享?

mpe*_*pen 52 c++ inheritance static

如果我有类似的东西

class Base {
    static int staticVar;
}

class DerivedA : public Base {}
class DerivedB : public Base {}
Run Code Online (Sandbox Code Playgroud)

都将DerivedADerivedB共享相同的staticVar或者他们每人将获得自己?

如果我想让他们各自拥有自己的,你会建议我做什么?

Gre*_*ill 44

他们将分享相同的实例staticVar.

为了使每个派生类获得自己的静态变量,您需要声明另一个具有不同名称的静态变量.

然后,您可以在基类中使用一对虚函数来获取和设置变量的值,并在每个派生类中覆盖该对,以获取和设置该类的"本地"静态变量.或者,您可以使用返回引用的单个函数:

class Base {
    static int staticVarInst;
public:
    virtual int &staticVar() { return staticVarInst; }
}
class Derived: public Base {
    static int derivedStaticVarInst;
public:
    virtual int &staticVar() { return derivedStaticVarInst; }
}
Run Code Online (Sandbox Code Playgroud)

然后你会用它作为:

staticVar() = 5;
cout << staticVar();
Run Code Online (Sandbox Code Playgroud)

  • (注意,CRTP还允许派生类获取自己的某些静态变量版本.) (3认同)

Mar*_*ram 31

要确保每个类都有自己的静态变量,您应该使用"奇怪的重复模板模式"(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> {};
Run Code Online (Sandbox Code Playgroud)

  • 我知道我 ** 非常** 迟到了讨论,但这可能会帮助像我一样正在学习的谷歌员工。任何人都可以指出这个答案和接受的答案之间的优点/缺点吗? (2认同)
  • 接受的答案要求您声明一个新的静态变量和访问方法。这个答案更优雅:您只需编写一次即可获得所需数量的静态变量:每个模板专业化一个。 (2认同)