静的メンバーが継承されるとき、それらは階層全体に対して静的であるか、そのクラスのみに対して静的であるか、つまり:
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になりますか?
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。
答えは、実際には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
派生オブジェクトが作成されると、派生クラスコンストラクターが基本クラスコンストラクターを呼び出すため、4です。
したがって、静的変数の値は2回インクリメントされます。
#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
SomeDerivedClass()が呼び出されると、SomeClass()コンストラクターが自動的に呼び出されます。これはC++ルールです。そのため、合計はSomeClassオブジェクトごとに1回増加し、SomeDerivedClassオブジェクトでは2回増加します。 2x1 + 2 = 4
3つすべてのインスタンスで3。
他の質問については、静的ではなくconst変数が本当に必要なように見えます。派生クラスでオーバーライドされる必要な変数を返す仮想関数を提供することは、より自明かもしれません。
このコードがパフォーマンスが必要なクリティカルパスで呼び出されない限り、常により直感的なコードを選択してください。
はい、派生クラスには同じ静的変数が含まれます。つまり、すべての合計に3が含まれます(合計がどこかで0に初期化されたと仮定)。