具有继承的静态变量的行为
我提这个问题是为了大家讨论。
假设我有流动的类层次结构
class A
{
public:
static int varr;
}
class B : public A
{
}
Class C : public A
{
}
如果我创建 B b1,b2,b3;
和 C c1,c2,c3;
和 A a1, a2; 的对象
1. varr
是否在上述所有对象之间共享,或者不同的对象会有单独的实例?
2.如果b1
对象改变了值,它是否会反映在c1
对象上。
I am asking this question for the discussion.
Suppose i have flowing class hierarchy
class A
{
public:
static int varr;
}
class B : public A
{
}
Class C : public A
{
}
If I create the Object of B b1,b2,b3;
and C c1,c2,c3;
and A a1, a2;
1.will varr
is shared across all the object mentioned above or there will be separate instance for different object?
2.if b1
object change the value it will be reflected for c1
object or not.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是的,它将在所有派生类(B,C)和基类(A)的所有实例中共享。
只会创建静态对象的一个实例,并且在所有位置都会引用该对象。因此,如果您在一个地方进行更改,则意味着更改将反映在所引用的所有位置。
Yes, it will be shared accross all the instance of all derived(B,C) and base class(A)..
Only one instance for a static object will be created, and at all place that object will be refered. So if you change at one place it means change will be reflected at all location where its being refered.
由于 varr 是静态的(与常规实例成员相反),因此只有一个属于类本身的副本,而不是属于类的实例。
B::varr
、C::varr
和A::varr
都访问同一个变量,因此没有为每个继承创建副本类要么。Since
varr
is static (as opposed to a regular instance members), there is only one copy of it that belongs to the class itself, not an instance of it.B::varr
,C::varr
andA::varr
all access the same variable, so there is no copy made for each inheriting class either.由于静态数据成员和方法不是针对每个对象的,而是针对每个类的。这意味着 A 类有一个 varr。
作为 B 类和C 是从 A 公开继承的,这使得 B 和 C 是从 A 继承的。 C 只不过是专门的 A.(有 IS-A 关系)
所以所有A,B& C 将共享相同的 varr
在私有继承的情况下,情况会有所不同,其中 B & C 不会专门化 A。而 B 和 B 则不会被专门化。 C 将无法访问 A::varr
As static data members and methods are not per object, they are per class. that means one varr is there for class A.
as class B & C are publically inherited from A, which makes B & C nothing but specialized A. (HAS IS-A RELATIONSHIP)
so all A, B & C will share the same varr
scenario would be different in case of private inheritance, where B & C would not be specialized A. And B & C will not have access to A::varr