我剛剛在上下文中遇到了使用指令,這對我來說是新的 - 例如將父類的成員從公共移動到私有。我已經測試了下面的示例,並且出現了兩個問題:C++:隱藏子類中的成員。是否有意義?
- (1)的代碼是否可移植?根據標準,它應該被棄用。
- 是否有意義隱藏公共成員的子類? (我認爲在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;
}
你的代碼顯示了兩種不同的東西:在B類有一個名爲'_i'兩個獨立的成員,而C類只有一個成員'_i' (從它的基類) – 2010-11-04 09:21:32
@馬丁,是的,這就是我的意圖。 C的變體是「它應該如何」。試圖在B中隱藏_i隱藏名稱「_i」,但是A :: _ i仍然存在。直到我在這方面遇到了使用廢棄物,這對我來說並不明顯。我很好奇,爲什麼VS2008不警告我。 :-( – 2010-11-04 09:33:43
你不是*試圖在B中隱藏'_i'!B代碼的(隱含的)意圖僅僅是讓一個名爲'_i'的成員。這個新的'_i'碰巧有相同的名稱作爲基類中的成員只是(隱含的)巧合,並且名稱隱藏可能被認爲是不幸的副作用。警告純粹是可選的,而標準POV和MS只是決定在這種情況下不需要警告。 – 2010-11-04 10:11:13