2011-04-28 16 views
9

我在问这个问题进行讨论。具有继承性的静态变量的行为

假设我有流动类层次

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.will varr对象跨越上述否则会有单独的实例中提到的所有的对象共享针对不同的对象?

2.如果b1对象更改它的值将反映为c1对象或不。

回答

11

是,它会翻过所有派生(B,C)和基类(A)的所有实例共享..

只有一个用于一个静态对象实例将被创建,并且在所有地方对象将被引用。所以如果你在一个地方改变,这意味着改变将会反映在它被引用的所有位置。

+1

所以,如果我的情况不同改变一个对象的varr,如b1,然后当我访问c1中的varr它是否会获得更新的值 – 2011-04-28 10:44:52

+2

只有一个静态对象的实例将被创建,并且在该对象将被引用的所有位置。所以如果你在一个地方改变,这意味着改变将会反映在它被引用的所有位置。 – vrajs5 2011-04-28 10:50:30

+1

+1为您的确切答案。 – karthik 2011-04-28 11:11:17

8

由于varr是静态的(与常规实例成员相反),所以它只有一个属于类本身的副本,而不是它的一个实例。 B::varr,C::varrA::varr都访问同一个变量,所以也没有为每个继承类创建副本。

1

由于静态数据成员和方法不是每个对象,它们是每个类。这意味着一个varr是有类A.
作为B类& C被公开从A继承,这使得乙&Ç只是专门A.(HAS IS-A的关系)
因此所有A,B &Ç将共享相同的varr

的情况是在私有继承,其中B & C将不会专门A.和早餐& C的温度将无法获得A :: varr