2015-05-25 98 views
1

C++作爲面嚮對象語言的主要設計原則之一就是讓每個類都可以訪問它的內部人員以及誰不能訪問。基類控制着它的訪問級別,即使它是關於嵌入在從Base派生的類的對象中的基類對象。使用聲明修改派生類中的訪問說明符

但是我讀了關於使用允許更改Derived類中的Base類成員的訪問級別的聲明。

class A{ 
    protected: 
    int n; 
}; 

class B:protected A{ 
    public: 
    using  A::n; 
}; 

int main(){ 
    B obj; 
    obj.n=0; 
} 

在上面的示例中,我將受保護成員的訪問級別更改爲派生類中的public。這是允許的嗎?爲什麼不能強制訪問級別應該更嚴格或等於它在基類中的級別(這也可以通過派生列表中的訪問限定來控制),但不能比訪問級別更寬鬆在基類中?這是否允許,因爲這允許一些有趣的設計模式?我只是想明白爲什麼像這樣打破了由類強制封裝的原則是允許的?

+4

即使這是不可能的,您仍然可以在派生類中添加公共getter/setter。 – Jarod42

+0

是Jarod42。這是可能的。但是這樣做仍然具有靈活性,允許稍後更改實現,因爲具有受保護成員的類很可能僅由相同團隊中的相同開發人員或開發人員派生出來。通過提供公共getter和setter,實現細節仍由這些開發人員控制。但是,通過允許某些內容公開,您可以讓整個世界訪問您的實現細節。 – Madhusudhan

+3

@ user3493289現在你正在混合兩件事情。好的做法和一些可能或不可行的事情。標準和編譯器不應限制和防止用戶傷害自己,至少它似乎是C++的主要準則之一。根據你的邏輯,你可以直接禁止直接暴露屬性。 – luk32

回答

0

一個原因是,即使您不是基類的所有者,這種方法甚至可以更改可見性修飾符。 例如,如果基類包含在外部庫/框架中,則可以更改可見性修飾符。

+0

但這違背了OOP的原則。如果圖書館設計師認爲不應該訪問某些東西,那麼它應該保持如此。否則,你會使他難以對其圖書館的實施做出任何改變。 – Madhusudhan

+0

說實話,事件getter/setter違反了信息隱藏,如Jarod42指出的 – pinturic

+1

@ user3493289那麼,通過這種方式'struct'也不符合OOP。 C++允許您執行可能會破壞古典OOP原理的事情。 –