我在讨论这个问题。
假设我有流动的类层次结构
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
对象的反映值。
答案 0 :(得分:11)
是的,它将在所有派生(B,C)和基类(A)的所有实例中共享。
只会创建一个静态对象的实例,并且在所有位置都会引用该对象。因此,如果您在一个地方进行更改,则意味着更改将反映在所引用的所有位置。
答案 1 :(得分:8)
由于varr
是静态的(与常规实例成员相对),因此只有一个副本属于类本身,而不是它的实例。 B::varr
,C::varr
和A::varr
都访问同一个变量,因此没有为每个继承类创建副本。
答案 2 :(得分:1)
由于静态数据成员和方法不是每个对象,因此它们是每个类。这意味着一个varr适用于A类。
作为B级和B级C公开地继承自A,这使得B& C只是专门的A.(HAS IS-A关系)
所以 A,B& C将共享相同的varr
在私人继承的情况下情况会有所不同,其中B& C不是专业的A.而且B& C将无法访问A :: varr