通过继承函数读取基类的私有成员(?)

时间:2017-08-20 12:18:28

标签: c++ class oop

在以下示例中,调用d.run();打印aD bD cD,我不明白为什么。我认为应该打印aB bB cB aD bD cD,因为我们正在向vars_Base的{​​{1}}向量推送所有6次(?)

根据输出,在我看来,Base成员vars_Base成员的副本虽然是Derivedprivate(?)< / p>

我应该澄清一下,这个问题的关键仅在于理解下面例子的行为 - 我的意图是不要通过Base访问Base的私人成员。

Derived

4 个答案:

答案 0 :(得分:2)

实例变量不在类的不同实例之间共享。虽然@Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart: "); mAuth.addAuthStateListener(mAuthStateListener); } b都具有d的成员,但它们各自都有自己的向量副本,因为向量是实例变量。

如果您希望类的所有实例共享变量的值,那么您应该将变量设置为static(如果需要,您也可以使用矢量静态的方法)。

答案 1 :(得分:2)

层次结构的任何类的每个实例都有自己的vars_Base实例。因此,BD一样有自己的作用。

vars_BaseBase是私有的这一事实只是意味着vars_BaseDerived中也是私有的。这意味着您无法访问b.vars_Based.vars_Base

但同样,vars_Base的两个实例没有任何共享,所以如果push_back中的BD中的内容存储在两个不同的vector中}}。

答案 2 :(得分:2)

Base bDerived 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)

它的bd是不同的实例(对象)。而且他们都有自己的变量。因此,这意味着std::vector中有一个vars_Base bd中有一个,分享其内容。

Object b

+---------------------------------+
|  b                              |
|                                 |
|  vars_Base        +----------+  |
|                   |    aB    |  |
|                   +----------+  |
|                   |    bB    |  |
|                   +----------+  |
|                   |    cB    |  | 
|                   +----------+  |
+---------------------------------+

内存中的其他地方

Object d
+---------------------------------+
|  d                              |
|                                 |
|  vars_Base        +----------+  |
|                   |    aD    |  |
|                   +----------+  |
|                   |    bD    |  |
|                   +----------+  |
|                   |    cD    |  | 
|                   +----------+  |
+---------------------------------+

类的实例不共享其内容,每个对象都有自己的内存和自己的变量。