C++ 静态成员是继承的吗?

C++ 静态成员是继承的吗?,c++,C++,我在类a中有一个静态成员变量,类B派生自类a class A { public: A() { a = 3; } static int a; }; int A::a = 0; class B : public A { public: B() { a = 4; } }; void main() { A objA; cout << "Before:" &

我在类a中有一个静态成员变量,类B派生自类a

class A
{
  public:
    A()
    {
      a = 3;
    }
    static int a;
};

int A::a = 0;

class B : public A
{
  public:
    B()
    {
      a = 4;        
    }
};

void main()
{
  A objA;
  cout << "Before:" << A::a;
  B obj;
  cout << endl << "After:" << A::a;
}
     
A类
{
公众:
()
{
a=3;
}
静态int a;
};
int A::A=0;
B类:公共A
{
公众:
B()
{
a=4;
}
};
void main()
{
奥布贾;

cout对静态变量的访问是继承的。请注意,具有私有访问权限的静态成员将无法访问,因为
protected
关键字就是用来访问静态成员的。

您的根本问题是,您错误地解释了链接到的问题的答案。当您派生类
B
不创建新的静态变量
a

因此,
A::A
B::A
是同一个变量。一旦你纠正了这个错误,对其他一切的理解就会变得显而易见

查看您的代码:

A objA; //A() executes which sets A::a to 3
cout << "Before:" << A::a; //outputs 3
B obj; //now B() executes and sets B::a to 4
cout << endl << "After:" << A::a; //outputs 4 since A::a is same variable as B::a
A objA;//执行A(),将A::A设置为3
库特
  • 静态变量可以通过该类的对象访问,为什么不能呢
  • 任何静态变量只有一个副本。如果另一个类继承了它,它只能访问同一个静态变量,而不能访问另一个副本
  • 因为
    B::B()
    A::A
    更改为4。
    B
    A
    共享对
    A::A
    的访问权限
  • 这里没有objA.a,可以访问B()构造函数中的a::a可见,因此可以作为“a”访问

  • B::a在内存中引用相同的地址,B::a没有新的静态变量,这与您可以通过&B::a检查的相同

  • 它不应该是3和3,应该是3和4,因为行“B obj;”更改了A::A值,并且因为(2)它的变量与B::A相同(即B()构造函数更改了A::A)

  • 静态成员是继承的吗

    在基类的静态成员也是任何派生类的静态成员的意义上,是的

    如何代替
    A::A
    我还可以访问
    objA.A
    。静态变量不应该通过该类的对象访问

    这就是语言的定义方式。两者都是等价的,如果您不能轻松地编写对象的类型,那么对象样式会更方便

    如果对于派生类也创建了一个新的静态变量(特定于类B),那么为什么不需要初始化类B的静态变量呢

    B
    没有特定的新静态变量;类
    a
    只有一个静态变量。继承意味着它也在类
    B
    内;但是
    a::a
    B::a
    都引用相同的变量

    为什么在预期前后显示3时,以下输出显示为[3,4]


    如上所述,只有一个变量,
    B
    的构造函数将其设置为
    4

    请注意,在我使用的两种情况下,我都没有使用B::a,它的a::a。还请注意,新的静态变量将被创建,并引用证明它的链接。确切地说,没有
    B::a
    ,只有Zuul..等等,只有
    A::A
    (对不起,@david heffernan的《阿凡达》让我想起了捉鬼者)@user2287617不,没有新的静态变量。
    A::A
    B::A
    是一回事。一旦你理解了这一点,你就会没事。很好。你应该接受一个答案。选择一个你认为最好的答案。但这就是所问问题的答案吗?@user2287617:这是对问题的答案标题,但不是正文中三个松散相关的问题。这完全是错误的。私有与否,所有成员都是继承的。标题的答案取决于您对术语继承的定义。关于对象样式的使用:类似于
    This->a
    (而不仅仅是
    a
    )可以在模板中使用,以使变量名依赖。您确实可以使用
    objA.a
    访问变量。