2013-05-08 81 views
2

我在类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?当派生类型对象由那么它也产生基本类型。 我有以下问题:

  1. 它是如何,而不是A::a我也可以访问objA.a?不应该通过该类的对象访问静态变量。

  2. 如果对于派生类还创建了一个新的静态变量(特定于class B),那么为什么没有必要初始化class B的静态变量?

  3. 为什么输出下面所示:

前:3

后:4

当预计将显示3之前和之后?

+0

标题的答案取决于您对术语*定义的定义*是。 – 2013-05-08 17:22:56

回答

2

对静态变量的访问是继承的。请注意,具有私人访问权的静态会员将无法访问,因为这是protected关键字的用途。

+0

但是,这是问的答案? – anurag86 2013-05-08 17:17:04

+1

@ user2287617:这是标题中提出的问题的答案,但不包括身体中三个松散相关的问题。 – 2013-05-08 17:21:56

+4

这根本就是错的。不论是否私人,_all_成员都被继承。 – 2013-05-08 17:27:38

1

您的根本问题是您错误地解释了您链接到的问题中的答案。当你推导出类B时你不要做一个新的静态变量a

所以,A::aB::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::aobjA.a是相同的变量。这包括在任何有关该语言的良好指南中。例如,网上你可以阅读cppreference.com它说,它是这样的:

要引用T类的静态成员N,可以使用两种形式:标准名称T ::米或成员访问表达EM或电子邮件 - > m,其中e是分别计算为T或T *的表达式。在同一个班级范围内,资格是不必要的。

+0

请注意我在两种情况下都不使用B :: a,它的A :: a。 – anurag86 2013-05-08 17:14:16

+0

另请注意,将创建新的静态变量是指证明它的链接。 – anurag86 2013-05-08 17:15:02

+4

没错 - 没有'B ::了',只有Zuul..no等待,只有'A ::了'(对不起,@大卫 - 赫弗南的头像给我捉鬼敢死队倒叙) – 2013-05-08 17:16:34

0
  1. 静态变量可通过该类的对象访问。他们为什么不呢?
  2. 任何静态变量只有一个副本。如果另一个类继承它,它只能访问相同的静态变量,而不是另一个副本。
  3. 因为B::B()已将A::a更改为4. BA共享访问A::a
1
  1. 这里没有objA.a,有访问内B()构造函数,其中A ::一个是可见的,因此可以视作 “一个” 访问。 B :: a是指内存中的相同地址,B :: a没有新的静态变量,它可以通过& B :: a检查。

  2. 预计不会是3和3,因为行“B obj”,因此预计为3和4。改变A :: a值,并且因为(2)它与B :: a(即B()构造器改变A :: a)相同的变量。

+0

您确实可以访问使用'objA.a'变量。 – 2013-05-08 17:45:09

+0

糟糕。老东西学习,谢谢。 – queen3 2013-05-08 18:18:05

0

静态成员是否被继承?

从这个意义上说,基类的静态成员也是任何派生类的静态成员,是的。

这是怎么回事,而不是A::a我也可以访问objA.a。静态变量不应该可以通过该类的对象访问。

这就是语言的定义。两者都是等价的,如果不能轻松写出对象的类型,则对象样式可以更方便。

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

没有特定于类B的新静态变量; A只有一个。继承意味着它也在类B的范围内;但A::aB::a都指向相同的变量。

为什么当预计显示3为前后时,下面的输出显示为[3,4]?

如上所述,仅存在一个变量,以及B套它构造函数4

+1

关于使用对象样式的:像'这个 - >了'(而不是仅仅'了')可以在模板中有用,使变量名相关。 – 2013-05-08 17:30:21