2012-05-01 39 views
1

我真的(很)很長時間沒有使用C++,這個問題可能很愚蠢,但我真的可以使用一些幫助。在C++中訪問基類私有成員

如果我的基類具有私有數據成員,並且派生類是公開派生的,則基類的私有成員不會被繼承。但是,它們仍然可以通過繼承的公共函數訪問。例如:

class B{ 
int a,b; 

public: 
void SetA(int); 
int GetA(); 
}; 

class D:public B{ 

public: 
SetAAttribute(int x) 
{ SetA(x); } 

} 

現在,我的問題如下: 技術上,在派生類對象沒有上定義的「a」屬性。通俗地說,我基本上是在一個實體上設置一個屬性,而這個屬性甚至不存在於這個實體中。想象這樣一個概念似乎很不直觀。我理解正確嗎?

任何額外的解釋或更正將不勝感激。

+0

'a'屬性存在,你只是沒有直接訪問它,因爲它是私人的。 –

+0

你可以讓你的基類成員'protected'被繼承,但是否則有私有屬性。 – chris

回答

7

這並不是說該屬性不再存在,它只是它對你隱藏而已。基類方法仍然可以訪問基類成員,因爲它們不會相互隱藏。

+0

屬性是在基類對象上定義的嗎?如果我要爲派生類設置這個屬性,它們並不是真的存在嗎?這並不是說他們是隱藏的,因爲私人成員從來沒有繼承過。例如:如果'color'是一個私有基類屬性,並且我的派生對象通過一個公共繼承函數設置了color屬性,它是否爲派生對象設置? – Bugaboo

+0

@Bugaoo,私人成員是遺傳的,但正如我所說他們是隱藏的;如果您嘗試使用它們,編譯器會抱怨,因爲它們不存在。但他們仍然在那裏。如果你做一個'sizeof',你會看到這個大小包含隱藏的成員。如果您設置了顏色屬性並且基類負責繪製對象,則它將以從派生類設置的顏色繪製它。 –

+0

非常感謝你的幫助。一個額外的後續問題。在設計解決方案時,將屬性設置爲私有屬性並通過公共繼承函數訪問它們,或者將屬性標記爲基類中的受保護屬性並直接在派生類中訪問它們是否合理? – Bugaboo

2

私有基礎成員是繼承的,如果你試圖訪問它們,編譯器會給你一個錯誤,因爲你不應該直接訪問它們。