静态成员是否被继承?
我在类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;
}
导出作为每Are static fields inherited?当派生类型对象由那么它也产生基本类型。 我有以下问题:
它是如何,而不是
A::a
我也可以访问objA.a
?不应该通过该类的对象访问静态变量。如果对于派生类还创建了一个新的静态变量(特定于
class B
),那么为什么没有必要初始化class B
的静态变量?为什么输出下面所示:
前:3
后:4
当预计将显示3之前和之后?
对静态变量的访问是继承的。请注意,具有私人访问权的静态会员将无法访问,因为这是protected
关键字的用途。
但是,这是问的答案? – anurag86 2013-05-08 17:17:04
@ user2287617:这是标题中提出的问题的答案,但不包括身体中三个松散相关的问题。 – 2013-05-08 17:21:56
这根本就是错的。不论是否私人,_all_成员都被继承。 – 2013-05-08 17:27:38
您的根本问题是您错误地解释了您链接到的问题中的答案。当你推导出类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
和objA.a
是相同的变量。这包括在任何有关该语言的良好指南中。例如,网上你可以阅读cppreference.com它说,它是这样的:
要引用T类的静态成员N,可以使用两种形式:标准名称T ::米或成员访问表达EM或电子邮件 - > m,其中e是分别计算为T或T *的表达式。在同一个班级范围内,资格是不必要的。
- 静态变量可通过该类的对象访问。他们为什么不呢?
- 任何静态变量只有一个副本。如果另一个类继承它,它只能访问相同的静态变量,而不是另一个副本。
- 因为
B::B()
已将A::a
更改为4.B
和A
共享访问A::a
。
这里没有objA.a,有访问内B()构造函数,其中A ::一个是可见的,因此可以视作 “一个” 访问。 B :: a是指内存中的相同地址,B :: a没有新的静态变量,它可以通过& B :: a检查。
预计不会是3和3,因为行“B obj”,因此预计为3和4。改变A :: a值,并且因为(2)它与B :: a(即B()构造器改变A :: a)相同的变量。
您确实可以访问使用'objA.a'变量。 – 2013-05-08 17:45:09
糟糕。老东西学习,谢谢。 – queen3 2013-05-08 18:18:05
静态成员是否被继承?
从这个意义上说,基类的静态成员也是任何派生类的静态成员,是的。
这是怎么回事,而不是
A::a
我也可以访问objA.a
。静态变量不应该可以通过该类的对象访问。
这就是语言的定义。两者都是等价的,如果不能轻松写出对象的类型,则对象样式可以更方便。
如果派生类也创建了一个新的静态变量(特定于类B),那么为什么没有必要初始化类B的静态变量?
没有特定于类B
的新静态变量; A
只有一个。继承意味着它也在类B
的范围内;但A::a
和B::a
都指向相同的变量。
为什么当预计显示3为前后时,下面的输出显示为[3,4]?
如上所述,仅存在一个变量,以及B
套它构造函数4
。
关于使用对象样式的:像'这个 - >了'(而不是仅仅'了')可以在模板中有用,使变量名相关。 – 2013-05-08 17:30:21
标题的答案取决于您对术语*定义的定义*是。 – 2013-05-08 17:22:56