【问题标题】:Are static fields inherited?静态字段是否继承?
【发布时间】:2010-11-03 03:37:48
【问题描述】:

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

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?

【问题讨论】:

    标签: c++ inheritance static


    【解决方案1】:

    在所有三个实例中都为 3。

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

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

    【讨论】:

      【解决方案2】:

      在所有情况下都为 3,因为 SomeDerivedClass 继承的 static int total 正是 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 具有不同的值——在这种情况下,子类“不继承”基类的静态,因为可以说,它是“隐藏”它它自己的同名。

      【讨论】:

      • 很好的解释,但数字答案实际上是4,而不是3。看我的答案(stackoverflow.com/questions/998247/…
      • +1,太好了,我正在编辑指向你的答案,谢谢!
      • +1,尽管应该更正确地说“+4 到静态成员初始化为的任何内容”。静态成员既不是本地作用域也不是命名空间作用域,因此必须在某处有一个定义来分配一个值(不一定为零)。否则代码不满足单一定义规则,无法编译。
      • 但是如果想要static int total 对每个派生类都不同,实现它的唯一方法是向每个类添加static int total?或者是否可以只使用基类定义(?),因为变量total 应该是每个类的属性。另一方面,它应该是static
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        答案实际上在所有情况下都是,因为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
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:
              #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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-09-10
                • 2012-06-21
                • 2011-04-02
                • 2013-10-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多