是否继承了静态字段?


102

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

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,或者对于2为SomeClass1是SomeDerivedClass

Answers:


55

在所有情况下均为3,因为static int totalby SomeDerivedClass的继承人恰好是中的SomeClass,而不是唯一的变量。

编辑:实际上4在所有情况下,,正如@ejames在他的答案中发现并指出的那样。

编辑:int在两种情况下,第二个问题中的代码都丢失了,但是添加后就可以了,即:

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

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

在A :: MaxHP和Cat :: MaxHP上可以使用不同的值正常工作-在这种情况下,子类从基类“不继承”静态,因为可以这么说,它是用自己的同义语“隐藏”了它之一。


12
很好的解释,但数值答案居然是4,而不是3。请参阅我的回答(stackoverflow.com/questions/998247/...
e.James

3
+1,非常好,我正在编辑答案以指出您的答案,谢谢!
Alex Martelli,2009年

1
+1,尽管应该更正确地说“将静态成员初始化为的+4”。静态成员既不是本地作用域,也不是名称空间作用域,因此必须在某处定义一个分配值(不一定为零)的定义。否则,代码将不符合一定义规则,因此无法编译。
戴蒙2012年

但是,如果static int total每个派生类都希望与众不同,那么将其添加static int total到每个类的唯一方法是吗?还是可能只使用基类定义(?),因为具有变量total应该是每个类的属性。另一方面应该是static
LRDPRDX

97

答案实际上是所有情况下的四个,因为的构造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

10

之所以为4,是因为在创建派生对象时,派生类构造函数将调用基类构造函数。
因此,静态变量的值将增加两次。


5
#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

1

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


0

在所有三种情况下均为3。

对于另一个问题,看来您真的只需要一个const变量而不是static即可。提供一个虚拟函数来返回您需要的变量,该变量在派生类中被覆盖,这可能更加不言自明。

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


0

是的,派生类将包含相同的静态变量,即-它们都将包含总计3(假设总计在某处被初始化为0)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.