2010-11-04 63 views
1

我剛剛在上下文中遇到了使用指令,這對我來說是新的 - 例如將父類的成員從公共移動到私有。我已經測試了下面的示例,並且出現了兩個問題:C++:隱藏子類中的成員。是否有意義?

  1. (1)的代碼是否可移植?根據標準,它應該被棄用。
  2. 是否有意義隱藏公共成員的子類? (我認爲在Java中訪問只能那麼嚴格在子類中進行。)

代碼格式錯誤

class A{ 
public: 
    A():_i(1975){} 
    int _i; 
}; 

class B : public A 
{ 
public: 
    B():_i(333){} 
    int i()const{ return _i;} 
private: 
    int _i; // (1)depricated? no warning in VS2008? 
}; 

class C : public A 
{ 
public: 
    C(){} //_i initialized by A 
    int i()const{ return _i+1;} 
private: 
    using A::_i; //(2) should be the right way 
}; 

int main() 
{ 
    B b; 
    int i= b.i(); //value of B::_i (333) 
    int a_i = static_cast<A*>(&b)->_i; //value of A::_i (1975) 

    C c; 
    int ca_i = c.i(); //value of A::_i via getter (1975+1) 
    //however, A::_i is still accessible 
    a_i = static_cast<A*>(&c)->_i; //value of A::_i (1975) 

    return 0; 
} 
+0

你的代碼顯示了兩種不同的東西:在B類有一個名爲'_i'兩個獨立的成員,而C類只有一個成員'_i' (從它的基類) – 2010-11-04 09:21:32

+0

@馬丁,是的,這就是我的意圖。 C的變體是「它應該如何」。試圖在B中隱藏_i隱藏名稱「_i」,但是A :: _ i仍然存在。直到我在這方面遇到了使用廢棄物,這對我來說並不明顯。我很好奇,爲什麼VS2008不警告我。 :-( – 2010-11-04 09:33:43

+1

你不是*試圖在B中隱藏'_i'!B代碼的(隱含的)意圖僅僅是讓一個名爲'_i'的成員。這個新的'_i'碰巧有相同的名稱作爲基類中的成員只是(隱含的)巧合,並且名稱隱藏可能被認爲是不幸的副作用。警告純粹是可選的,而標準POV和MS只是決定在這種情況下不需要警告。 – 2010-11-04 10:11:13

回答

1

廣告(1):我看不出有任何理由爲什麼這應該是棄用。我認爲這是完全合法的C++。 (類B增加了其影子在A_i_i的第二個副本,但你仍然可以通過b.A::_i訪問後者。)

廣告(2):這似乎並沒有在所有對我有用的,因爲你可以仍然通過使用c.A::_i訪問_ic,所以它不會被隱藏。

+0

( 1)根據「ANSI/ISO C++專業程序員手冊」第2章它已被棄用(2)對我也是,我試圖找出它是否有用例:-) – 2010-11-04 09:43:27

1

然而醜陋的這段代碼對我來說......(只是審美的個人感覺還行)。

這是非隱藏會員。這是一個添加成員。 此代碼中有兩個iA::_iB::_i

之後可以玩。但是當代碼以這種方式誤導時,我真的不喜歡它。

+0

哦,對不起。我忘了提及這是一個示例代碼( - :對不起,對於短名和缺少Doxygen的評論:-)確實,B類是誤導性的。這是我的意圖,表明它是。對於我來說這個成員並不是很明顯。我希望編譯器給我一個警告:-( – 2010-11-04 10:05:05

+0

@Valentin,不要擔心男人,我只是在作出反應。不要擔心評論,我習慣了(大多數人會說這是一個壞習慣)儘量減少評論的可能性,我嘗試使用健談的函數名稱和變量來表達他們所做的事情,並且做他們所說的話。編譯器不會給出警告,因爲它是一個C++特性,你總是可以創建一個具有相同名稱的變量,這個變量具有更大的生命週期,不僅適用於類成員,而且也適用於普通函數。 – 2010-11-04 10:23:26

1

爲了您的娛樂,在C++隱藏功能GotW討論:-)