静态字段是否被inheritance?

当静态成员被inheritance时,它们对于整个层次结构是静态的,还是仅仅是这个类,即:

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,或者对于SomeClass是2,对于SomeDerivedClass 1?

3在所有情况下,由于SomeDerivedClassinheritance的static int total正好是SomeClass那个,而不是一个独特的variables。

编辑:实际上4在所有情况下,作为@ejames发现,并在他的答案指出,这看。

编辑:第二个问题中的int在这两种情况下都缺lessint ,但添加它使得它确定,即:

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

对于A :: MaxHP和Cat :: MaxHP来说工作正常并且具有不同的值 – 在这种情况下,子类是“不从基类inheritance”静态的,也就是说,它可以用它自己的同名来“隐藏”它一。

答案实际上是四个 ,因为SomeDerivedClass的构造会使总数增加两倍

这是一个完整的程序(我用来validation我的答案):

 #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,因为当派生对象被创build时,派生类构造函数调用基类构造函数。
所以静态variables的值增加了两倍。

 #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 

3在所有三个情况下。

而对于你的其他问题,看起来你真的只需要一个constvariables而不是静态的。 提供一个虚函数可能会更明了,这个虚函数会返回在派生类中被覆盖的variables。

除非在需要性能的关键path中调用此代码,否则请始终select更直观的代码。

是的,派生类将包含相同的静态variables,即 – 他们都将包含3总(假设总被初始化为0的地方)。

当调用SomeDerivedClass()时,SomeClass()构造函数被自动调用,这是一个C ++规则。 这就是为什么每个SomeClass对象总计增加一次,然后是SomeDerivedClass对象两次。 2×1 + 2 = 4