2017-08-20 100 views
1

在下面的示例中,調用d.run();打印aD bD cD,我不明白爲什麼。我會認爲它應該打印aB bB cB aD bD cD而不是因爲我們正在推動的載體Basevars_Base所有6次(?)通過繼承函數(?)讀取基類的私有成員

基於輸出,在我看來,一個副本所做的vars_Base件與Derived類(?),雖然它是privateBase

我要澄清,這個問題的關鍵是僅僅理解下面的例子中的水煤漿 - 我的意思是不是通過Derived訪問的Base私有成員。

#include <iostream> 
#include <vector> 

class Base 
{ 
private: 
    std::vector<std::string> vars_Base; 

protected: 
    std::vector<std::string> &get_vars() 
    { 
    return vars_Base; 
    } 

public: 
    void push_back(const std::string &str) 
    { 
    get_vars().push_back(str); 
    } 

    void run() 
    { 
    for (auto int_vars_it : get_vars()) 
    { 
     std::cout << int_vars_it << " "; 
    } 
    } 
}; 

class Derived : public Base 
{ 
}; 

int main(int argc, char *argv[]) 
{ 
    Base b; 
    b.push_back("aB"); 
    b.push_back("bB"); 
    b.push_back("cB"); 
    b.run(); // prints aB bB cB 

    std::cout << std::endl; 

    Derived d; 
    d.push_back("aD"); 
    d.push_back("bD"); 
    d.push_back("cD"); 
    d.run(); // prints aD bD cD 

    return 0; 
} 
+1

你推三件事寫的代碼,所以你要打印出三樣東西。不清楚你爲什麼期望六。如果用'Base d;'代替'Derived d;',你是否仍然期望打印六個項目? – juanchopanza

+1

'b'不是'd'的一部分。即使這些類型是相互繼承的,但這些變量是完全獨立的。所以在'b'中有'vars_Base',另一個在'd'中。 –

+0

@juanchopanza在所有6種情況下,我們都推動向量'vars_Base',我們不是(?) – BillyJean

回答

2

實例變量不在類的不同實例之間共享。儘管bd都具有B的成員,但它們各自都有自己的矢量副本,因爲矢量是一個實例變量。如果你想要一個類的所有實例共享一個變量的值,那麼你應該讓變量是靜態的(如果你願意的話,你也可以使用這個向量的方法也是靜態的)。

+0

啊,我明白了。鑑於私有成員不是被繼承的,對象'd'推向什麼變量? – BillyJean

+0

@BillyJean再一次,它與成員私有(或公共或受保護)完全沒有關係。 – juanchopanza

+0

@juanchopanza但'd'將值推入名爲'vars_Base'的向量中。這在'Base'中是私有的,因此不會繼承到'Derived'。那麼,如果這個成員變量不是'd'的一部分,它在哪裏呢? – BillyJean

1

它的影響因子bd是不同的實例(對象)。而且他們都有自己的變數。所以這意味着有一個std::vectorvars_Baseb和一個在d和他們不要分享它的內容。

Object b 

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

別的地方在內存中的類

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

實例不共享的內容,每個這些對象都有它自己的內存和它自己的變量。

2

該層次結構的任何類的每個實例都有其自己的實例vars_Base。所以B有它自己的以及D

vars_Base私人在Base只是暗示vars_Base私人在Derived這一事實。這意味着您無法訪問b.vars_Based.vars_Base

但同樣的vars_Base無共享的兩個實例,因此,如果您push_back東西在BD的對象都存儲在兩個不同的vector

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();