陰影是壞還是壞取決於您引入衝突名稱的順序。
假設你有一個類庫和類之一是這樣的:
struct Base {
int a;
};
後來,誰在使用你類庫的顧客A寫道的:
class DerivedA : public Base {
private:
int a;
};
在這種情況下,陰影可能是無意的。客戶意外遮蔽Base::a
。
但是,假如你也有客戶B,誰寫的:
class DerivedB : public Base {
private:
int b;
};
到目前爲止好。現在,您建立了庫,以便使用Base
對象,而使用庫的客戶B構建了一個使用Base
和DerivedB
對象的代碼體。
幾個星期後,您意識到爲了獲得新功能,您需要添加一個新成員到Base
。
struct Base {
int a;
int b; // new member variable
};
這是否會對您的圖書館造成問題?它是否對顧客B造成問題?
不,它不會產生任何問題。
您所有的代碼,使用Base
將繼續使用Base
,並且它可以使用b
成員獲得新奇b
功能。即使DerivedB
對象被傳遞給期望爲Base
的函數,但Derived
隱藏的事實b
對Base
沒有影響。您使用Base
的函數可以說是b
,它將訪問Base
成員變量。
同時,所有使用DerivedB
將繼續使用DerivedB
,當該代碼表示b
,它得到DerivedB::b
,就像它以前那樣客戶B的代碼。嘿,陰影拯救了一天! (當然,如果顧客B想要開始利用新的b
功能,那麼顧客B必須做額外的工作來解決衝突,但重要的是影子沒有產生任何新問題在現有代碼中)。
在一天結束時,陰影的好壞取決於引入衝突名稱的順序。這不是編譯器已經洞悉的東西。
gcc也沒有提供警告,但有趣的是,這種行爲應該如何與多態性整體工作 – Starl1ght
我相信,即使沒有'private',在你的例子中隱藏一個變量,幾乎總是一個錯誤。我爲[clang](https://llvm.org/bugs/show_bug.cgi?id=31222)和[gcc](https://gcc.gnu.org/bugzilla/show_bug.cgi)提交了一項功能請求。 ID = 78632)。 –
@VittorioRomeo在編寫Derived時,如果'Base'中不存在'a'不是錯誤。 –