在以下示例中,调用d.run();
打印aD bD cD
,我不明白为什么。我认为应该打印aB bB cB aD bD cD
,因为我们正在向vars_Base
的{{1}}向量推送所有6次(?)
根据输出,在我看来,Base
成员vars_Base
成员的副本虽然是Derived
到private
(?)< / p>
我应该澄清一下,这个问题的关键仅在于理解下面例子的行为 - 我的意图是不要通过Base
访问Base
的私人成员。
Derived
答案 0 :(得分:2)
实例变量不在类的不同实例之间共享。虽然@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
mAuth.addAuthStateListener(mAuthStateListener);
}
和b
都具有d
的成员,但它们各自都有自己的向量副本,因为向量是实例变量。
如果您希望类的所有实例共享变量的值,那么您应该将变量设置为static(如果需要,您也可以使用矢量静态的方法)。
答案 1 :(得分:2)
层次结构的任何类的每个实例都有自己的vars_Base
实例。因此,B
和D
一样有自己的作用。
vars_Base
中Base
是私有的这一事实只是意味着vars_Base
在Derived
中也是私有的。这意味着您无法访问b.vars_Base
或d.vars_Base
。
但同样,vars_Base
的两个实例没有任何共享,所以如果push_back
中的B
和D
中的内容存储在两个不同的vector
中}}。
答案 2 :(得分:2)
Base b
和Derived D
是完全不同的对象,彼此之间没有任何关系。
该类是对象的蓝图,而不是对象本身。该类的多个实例具有不同的内存区域。
要获得所需的输出,可以将代码编写为
Derived d;
d.push_back("aB");
d.push_back("bB");
d.push_back("cB");
d.push_back("aD");
d.push_back("bD");
d.push_back("cD");
d.run();
答案 3 :(得分:1)
它的b
和d
是不同的实例(对象)。而且他们都有自己的变量。因此,这意味着std::vector
中有一个vars_Base
b
,d
中有一个,不分享其内容。
Object b
+---------------------------------+
| b |
| |
| vars_Base +----------+ |
| | aB | |
| +----------+ |
| | bB | |
| +----------+ |
| | cB | |
| +----------+ |
+---------------------------------+
内存中的其他地方
Object d
+---------------------------------+
| d |
| |
| vars_Base +----------+ |
| | aD | |
| +----------+ |
| | bD | |
| +----------+ |
| | cD | |
| +----------+ |
+---------------------------------+
类的实例不共享其内容,每个对象都有自己的内存和自己的变量。