C++ 静态成员是继承的吗?
我在类a中有一个静态成员变量,类B派生自类aC++ 静态成员是继承的吗?,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:" &
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
访问变量。