13

重複の可能性:
サブクラス化時に静的変数をオーバーライドする

基本クラスから派生した一連のクラスがあります。これらの派生クラスはいずれも、同じ静的変数を宣言します。ただし、派生クラスのそれぞれに固有です。

次のコードを検討してください。

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。どの派生クラスにもこの変数があります。したがって、この変数を基本クラスのスコープで参照できるようにしたいと考えています。

単純なメンバー変数であれば、これは問題になりません。ただし、意味的には、変数は実際には派生クラスのインスタンスのプロパティではなく、派生クラス自体のプロパティです。したがって、静的変数にする必要があります。

更新ポリモーフィックな性質を維持するには、クラス階層が必要です。つまり、すべての派生クラスのインスタンスは、共通の基本クラスのメンバーである必要があります。

ただし、基本クラスのメソッドからこの変数を取得するにはどうすればよいでしょうか?

4

2 に答える 2

23

不思議なことに繰り返し発生するテンプレートパターンを使用できます。

// 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>
{
};

これでクラスができ、それぞれが中間の基本クラスを介して利用できるようDerived1になります。また、とは両方とも絶対基本クラスを介して共通の機能を共有します。Derived2static int xDerived1Derived2Base

于 2012-10-09T09:26:05.940 に答える
5

仮想ゲッター機能付き

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);
}
于 2012-10-09T09:31:30.693 に答える