2012-07-10 67 views
1

假設我有一個基本&派生類:C++ |重用基類的保護成員

class Base{ 
private: 
    int* _privateIntPtrB; 
protected: 
    int* _protectedIntPtrB; 
public: 
    //methods which use 
    //_privateIntPtrB and _protectedIntPtrB 

class Derived: public Base{ 
private: 
    int* _privateIntPtrD; 
protected: 
    int* _protectedIntPtrB; //I am redeclaring this var 
public: 
    //methods which use 
    //_privateIntPtrD and _protectedIntPtrB 

我的問題: 在Derived類的方法,並習慣的_protectedIntPtrB派生版本? (我認爲它確實,但想確認)。

如果一個方法沒有被Derived類重新定義,_protectedIntPtrB的哪個版本將被一個指向Derived類的指針使用?

我想問的原因 - 我想在Derived類中初始化_protectedIntPtrB類,並且希望_protectedIntPtrB的版本在Derived類的所有實例中使用。

+3

難道你不能只重用原來的一個,並在它的構造函數中給它賦一個不同的值嗎? – Wug 2012-07-10 14:19:23

+1

我總是發現這類問題很難回答,儘管現在使用C++已經有十多年了。只是因爲「正確」的答案是給那些試圖這麼做的人:「我不在乎如果你這樣做會發生什麼,*不這樣做!* :-D(見Wug的評論。) – DevSolar 2012-07-10 14:20:17

+0

它將使用Derived類中的一個,但是如果您「希望在Derived類的所有實例中使用該版本的_protectedIntPtrB」 - 是否指靜態? – 2012-07-10 14:23:17

回答

5

在派生類的方法中,是否使用_protectedIntPtrB的派生版本?

是,它隱藏基類成員和因此在Derived的範圍不合格使用_protectedIntPtrBDerived::_protectedIntPtrB。 (基類變量仍然可用,如果符合Base::_protectedIntPtrB的條件)。

如果一個方法沒有被Derived類重新定義,哪個版本的_protectedIntPtrB將被指向Derived類的指針所使用?

基類變量。派生類的數據成員不能從基類中獲得。

的原因,我問 - 我想初始化在派生類_protectedIntPtrB不同,想在派生類的所有實例中使用的_protectedIntPtrB的那個版本。

通常,使派生類的行爲與其基類不同的最佳方式是覆蓋虛函數。如果你真正想到你想要達到的目標,可能會更好:找出你想要修改的行爲,並將其封裝在一個虛擬函數中。

+0

感謝你重新執行第二點。 – armundle 2012-07-10 14:56:57