当继承静态成员时,它们对于整个层次结构是静态的,还是仅对该类是静态的,即:
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?
答案 0 :(得分:92)
在所有情况下,答案实际上是四,因为构造SomeDerivedClass
会导致总计增加两次。
这是一个完整的程序(我用它来验证我的答案):
#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
答案 1 :(得分:48)
3在所有情况下,由于static int total
继承的SomeDerivedClass
正好是SomeClass
中的int
,而不是一个独特的变量。
编辑:在所有情况下实际上 4 ,正如@ejames在他的回答中发现并指出的那样。
编辑:第二个问题中的代码在两种情况下都缺少class A
{
public:
static int MaxHP;
};
int A::MaxHP = 23;
class Cat: A
{
public:
static const int MaxHP = 100;
};
,但添加它使它没问题,即:
{{1}}
工作正常并且A :: MaxHP和Cat :: MaxHP具有不同的值 - 在这种情况下,子类是“不继承”来自基类的静态,因为,可以说,它是“隐藏”它它自己的同名者。
答案 2 :(得分:7)
它是4,因为在创建派生对象时,派生类构造函数会调用基类构造函数 所以静态变量的值增加了两倍。
答案 3 :(得分:4)
#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 :(得分:1)
当调用SomeDerivedClass()时,会自动调用SomeClass()构造函数,这是一个C ++规则。这就是为什么每个SomeClass对象增加一次总数,然后为SomeDerivedClass对象增加两次。 2×1 + 2 = 4
答案 5 :(得分:0)
。
对于你的另一个问题,看起来你真的只需要一个const变量而不是静态变量。提供一个返回所需变量的虚函数可能更加不言自明,该函数在派生类中被覆盖。
除非在需要提高性能的关键路径中调用此代码,否则请始终选择更直观的代码。
答案 6 :(得分:0)
是的,派生类将包含相同的静态变量,即 - 它们总共包含3个(假设总数在某处初始化为0)。