静态方法中的静态变量在基类和继承中

时间:2010-04-29 11:52:57

标签: c++ inheritance static-methods static-variables

我有这些C ++类:

class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base
{

};

class B : public Base
{

};

xA之间是否会共享B静态变量,或者每个静态变量都有自己独立的x变量(这就是我想要的) ?

6 个答案:

答案 0 :(得分:14)

整个程序中只有一个x个实例。一个很好的解决方法是使用CRTP

template <class Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A> { };
class B : public Base<B> { };

这将为从中派生的每个类创建不同的Base<T>,因此创建一个不同的x

你可能还需要一个“Baser”基础来保留多态性,正如Neil和Akanksh指出的那样。

答案 1 :(得分:3)

只有一个,由所有三个班级共享。如果需要单独的实例,则必须在派生类中创建单独的函数。

答案 2 :(得分:3)

我很确定它将在A和B之间共享。

如果您想要自变量,可以使用“奇怪的重复模板模式”,如:

template<typename Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{

};

class B : public Base<B>
{

};

当然,如果你想要多态,你必须定义一个基本派生的偶数“Baser”类,因为Base<A>Base<B>不同,如:

class Baser
{
};

template<typename Derived>
class Base : public Baser
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{};

class B : public Base<B>
{};

现在A和B也可以是多态的。

答案 3 :(得分:2)

前者。本地静态变量绑定到包含它们的方法,并且method存在于所有子类的一个化身中(实际上,对于整个应用程序,即使程序的其余部分没有看到该方法)。

答案 4 :(得分:1)

变量将被共享 - 它是每个函数 - 在这种情况下,它所属的函数是Base::method()。但是,如果class Base是一个模板类,您将获得class Base模板的每个实例化(每个唯一的实际模板参数集)的变量的一个实例 - 每个实例化都是一个新函数。

答案 5 :(得分:1)

如果您将X设为静态,则它将在所有子类之间共享。该函数没有问题是静态的。