web-dev-qa-db-ja.com

静的フィールドは継承されますか?

静的メンバーが継承されるとき、それらは階層全体に対して静的であるか、そのクラスのみに対して静的であるか、つまり:

class SomeClass
{
public:
    SomeClass(){total++;}
    static int total;
};

class SomeDerivedClass: public SomeClass
{
public:
    SomeDerivedClass(){total++;}
};

int main()
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;
    return 0;
}

3つすべてのインスタンスで合計3になりますか、それともSomeClassで2で、SomeDerivedClassで1になりますか?

94
user98188

static int totalが継承するSomeDerivedClassは、SomeClassにあるものであり、個別の変数ではありません。

編集:実際には4すべての場合において、@ ejamesが彼の答えで見つけて指摘したように、それを参照してください。

編集:2番目の質問のコードには、どちらの場合もintがありませんが、追加するとOKになります。

class A
{
public:
    static int MaxHP;
};
int A::MaxHP = 23;

class Cat: A
{
public:
    static const int MaxHP = 100;
};

a :: MaxHPとCat :: MaxHPの異なる値で正常に動作します-この場合、サブクラスは基本クラスから静的を「継承しません」です。 1。

49
Alex Martelli

答えは、実際にはfourです。なぜなら、SomeDerivedClassの構築により、合計がインクリメントされるためですtwice

完全なプログラムを次に示します(答えを確認するために使用しました)。

#include <iostream>
#include <string>

using namespace std;

class SomeClass
{
    public:
        SomeClass() {total++;}
        static int total;
        void Print(string n) { cout << n << ".total = " << total << endl; }
};

int SomeClass::total = 0;

class SomeDerivedClass: public SomeClass
{
    public:
        SomeDerivedClass() {total++;}
};

int main(int argc, char ** argv)
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;

    A.Print("A");
    B.Print("B");
    C.Print("C");

    return 0;
}

そして結果:

A.total = 4
B.total = 4
C.total = 4
93
e.James

派生オブジェクトが作成されると、派生クラスコンストラクターが基本クラスコンストラクターを呼び出すため、4です。
したがって、静的変数の値は2回インクリメントされます。

8
VenuGopal
#include<iostream>
using namespace std;

class A
{
public:
    A(){total++; cout << "A() total = "<< total << endl;}
    static int total;
};

int A::total = 0;

class B: public A
{
public:
    B(){total++; cout << "B() total = " << total << endl;}
};

int main()
{
    A a1;
    A a2;
    B b1;

    return 0;
}

それはそのようになります:

A() total = 1
A() total = 2
A() total = 3
B() total = 4
4
rocky4android

SomeDerivedClass()が呼び出されると、SomeClass()コンストラクターが自動的に呼び出されます。これはC++ルールです。そのため、合計はSomeClassオブジェクトごとに1回増加し、SomeDerivedClassオブジェクトでは2回増加します。 2x1 + 2 = 4

1

3つすべてのインスタンスで3。

他の質問については、静的ではなくconst変数が本当に必要なように見えます。派生クラスでオーバーライドされる必要な変数を返す仮想関数を提供することは、より自明かもしれません。

このコードがパフォーマンスが必要なクリティカルパスで呼び出されない限り、常により直感的なコードを選択してください。

0
adzm

はい、派生クラスには同じ静的変数が含まれます。つまり、すべての合計に3が含まれます(合計がどこかで0に初期化されたと仮定)。

0
Niki Yoshiuchi