在下面的示例中,調用d.run();
打印aD bD cD
,我不明白爲什麼。我會認爲它應該打印aB bB cB aD bD cD
而不是因爲我們正在推動的載體Base
vars_Base
所有6次(?)通過繼承函數(?)讀取基類的私有成員
基於輸出,在我看來,一個副本所做的vars_Base
件與Derived
類(?),雖然它是private
到Base
我要澄清,這個問題的關鍵是僅僅理解下面的例子中的水煤漿 - 我的意思是不是通過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;
}
你推三件事寫的代碼,所以你要打印出三樣東西。不清楚你爲什麼期望六。如果用'Base d;'代替'Derived d;',你是否仍然期望打印六個項目? – juanchopanza
'b'不是'd'的一部分。即使這些類型是相互繼承的,但這些變量是完全獨立的。所以在'b'中有'vars_Base',另一個在'd'中。 –
@juanchopanza在所有6種情況下,我們都推動向量'vars_Base',我們不是(?) – BillyJean