2010-10-08 24 views
0

我有一個從派生類Base派生的類Derived。在Derived的函數中,我可以訪問Base的受保護成員。例如,我可以做到這一點。當從派生類訪問基類成員時,強制使用範圍解析運算符

class Base 
{ 
protected: 
    int i; 
} 

class Derived : class Base 
{ 
    void process() 
    { 
     i = 5; 
    } 
} 

我的問題是,是否有可能在從派生類訪問基類成員時強制使用範圍解析運算符?原因是我想在代碼中清楚哪些變量來自基類。執法是這樣,我不會意外跳過範圍解決運算符(我粗心)。我更喜歡不使用訪問器,因爲基類中的許多成員在Derived類中是必需的,這使得代碼很繁瑣。我正在使用MSVC 2010。

class Base 
{ 
protected: 
    int i; 
} 

class Derived : class Base 
{ 
    void process() 
    { 
     Base::i = 5; //enforce so that i=5 won't compile 
    } 
} 
+0

爲什麼......你要做到這一點?如果您對保護成員不滿意,請勿使用它們。 – 2010-10-08 08:00:35

+3

我建議閱讀Herb Sutter的GotW關於封裝的文章。總結一下:[「編寫公共或受保護的數據成員從未有充分的理由」](http://www.gotw.ca/gotw/070.htm) – 2010-10-08 08:02:44

+0

這比調用保護程序更好的「文檔」成員「base_i」等...? (醜陋,但這是你做的麻煩; -P)。 – 2010-10-08 08:53:47

回答

1

你不能在基類本身做它,不,你沒有辦法強制這樣做。然而,我正在考慮一個技巧,你可以在派生類中執行你想要的操作,也就是說,如果你在派生類中聲明一個具有相同名稱的變量作爲成員,但類型爲MyBadType ,這只是一個空的類型,然後我在派生將引用它,用戶可以用它做什麼都沒有。所以他將有資格獲得基地我。但這自然是一個笑話,我的意思是,你不想增加派生類的大小來強制限定名稱。你的目標本身有點可疑。

HTH, 阿爾緬

+0

如果派生類實際上有一個有效的數據成員具有相同的名稱,這將無法正常工作。 – 2010-10-08 08:09:33

+0

如果派生類有一個有效的數據成員具有相同的名稱,那麼技巧已經完成,我的意思是,然後用戶必須限定名稱才能到達基礎成員,對嗎? – 2010-10-08 08:15:18

+0

這是對的,我沒有想到通過。 – 2010-10-08 08:20:25

2

你可以通過引入另一個範圍模擬它:

class Base { 
protected: 
    struct Data {int i;}; 
    Data d_Base; 
}; 

class Derived : class Base { 
    void process() { 
     d_Base.i = 5; 
    } 
}; 
相關問題