2016-11-08 20 views
0

AクラスおよびBaseBクラスが派生するBaseクラスについて考えてみましょう。 BaseBからはCクラスが派生します。すべてのクラスは非静的変数 "y"を継承しますが、BaseBおよびCクラス "y"の場合は同じ値を持ちます。 私は、次のコードでこのような状況を解決:それは右、この場合の非静的変数に静的変数を割り当てるには、それを動作しますが、ある静的変数を非静的変数に割り当てる

class Base { 
    protected: 
     int y; 
    virtual void registerValue() 
     { 
     y = 5; 
     } 

}; 

class A : public Base { 
}; 

class BaseB : public Base { 
    protected: 
    static int x; 
     virtual void registerValue() 
     { 
      // Process x ... 
      y = x; 
     } 

}; 

class C : public BaseB { 

}; 

int BaseB::x = 3; 

int main() {} 

+0

なぜそうでないのか分かりません。 – Medinoc

+0

"すべてのクラスは非静的変数" y "を継承しますが、BaseBとCクラス" y "の場合は同じです(これは、値 " - まあ、それらはすべてYの同じ値を持っています。それ以外の場合は別の値に設定します。すなわち、あなたが 'BまたはC :: registerValue'を呼び出すと、あなたはおそらくあなたが望むものではないAの値を変更することになります。 – UKMonkey

+0

UKMonkeyは、クラスAが独自のメンバーyを持つ他のインスタンスを生成することを認識します。 – Ruben

答えて

2

言語の合法性の観点からは問題ありませんが、少し奇妙です。

おそらくBase::ystaticは、Aクラスの動作を妨げるため、作成できません。

BaseBのインスタンスはすべて同じxを共有しますが、異なる値のyを持つ可能性があります。それは意図された行動ですか?

は個人的に私は、基本クラスでvoid registerValue()純粋仮想関数にすることを検討したい、とすべての派生クラスは、その実装のために必要なすべてのストレージを含む、そのメソッドを実装することを期待しています。おそらく、基底クラス関数virtual int getRegistedValue() = 0も必要でしょうか?

+0

はいBathsheba Aクラスの場合、 "y"変数が異なるため、Base :: y staticを作成できません。 xがCloneBaseBとCで同じであることを保証する静的なxでは、結果としてこれらのクラスでyと同じ値が返されます – Ruben

+0

実装では、仮想int getRegistedValue()= 0を実装する必要はありません。 – Ruben