关于c ++:每个派生类的静态变量

static variable for each derived class

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Overriding static variables when subclassing

我有一组类,这些类都是从基类派生的。这些派生类中的任何一个都声明相同的静态变量。但是它是特定于每个派生类的。

考虑下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Base {
    // TODO: somehow declare a"virtual" static variable here?
    bool foo(int y) {
        return x > y; // error: ‘x’ was not declared in this scope
    }
};

class A : public Base {
    static int x;
};

class B : public Base {
    static int x;
};

class C : public Base {
    static int x;
};

int A::x = 1;
int B::x = 3;
int C::x = 5;

int main() {}

在我的基类中,我希望实现一些逻辑,这需要了解特定于派生类的x。任何派生类都有这个变量。因此,我希望能够在基类范围内引用这个变量。

如果它是一个简单的成员变量,这不会是一个问题。然而,从语义上讲,变量实际上不是派生类实例的属性,而是派生类本身的属性。因此,它应该是一个静态变量。

更新我需要类层次结构来保留它的多态性。也就是说,所有派生类的实例都需要是公共基类的成员。

然而,如何从基类方法中获得这个变量呢?


您可以使用奇怪的循环模板模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// This is the real base class, preserving the polymorphic structure
class Base
{
};

// This is an intermediate base class to define the static variable
template<class Derived>
class BaseX : public Base
{
    // The example function in the original question
    bool foo(int y)
    {
        return x > y;
    }

    static int x;
};

class Derived1 : public BaseX<Derived1>
{
};

class Derived2 : public BaseX<Derived2>
{
};

现在,类Derived1Derived2都将通过中间基类提供一个static int x!另外,Derived1Derived2都将通过绝对基类Base共享相同的功能。


使用虚拟getter函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Base {
public:
    bool foo(int y) const{
        return getX() > y;
    }
    virtual int getX() const = 0;
};

class A : public Base {
    static const int x;
    int getX() const {return x;}
};

class B : public Base {
    static const int x;
    int getX() const {return x;}
};

class C : public Base {
    static const int x;
    int getX() const {return x;}
};

int A::x = 1;
int B::x = 3;
int C::x = 5;

int main()
{
    C c;
    bool b = c.foo(3);
}