静态字段是否继承?

时间:2009-06-15 20:38:32

标签: c++ inheritance static

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

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?

7 个答案:

答案 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)。