2011-01-05 37 views
6

鑑於我們已經在基類中重載了方法,並且繼承了私有/受保護的派生類。基類重載方法的訪問聲明

  1. 我們可以只重建一個/幾個重載方法的原始訪問級別嗎?
  2. 在GCC 4.4.0上,我嘗試將基礎方法置於受保護的訪問之下,然後使用私有訪問繼承它。當我嘗試恢復訪問級別的公共,它的作品!這是如何工作的?或者它是編譯器上的錯誤?據我的理解,恢復訪問級別不應該被用來提升或降低成員的訪問級別。

代碼片段:

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

BTW-是像'base :: method'這樣的聲明,完全等價於'using base :: method'? – Kos 2011-01-05 18:39:46

+0

@Kos,是的,但在C++ 0x中不再有效地說'base :: method;'。它被n3225草稿刪除。 – 2011-01-05 20:48:08

回答

4

通過using聲明改變的遺傳功能的無障礙不能在給定的過載選擇性地進行,原因很簡單,一個using聲明只作了名稱到聲明性區域和由定義,作用過載共享相同的名稱。

我在這裏看到的唯一的選擇就是用平凡的轉發功能:

class derived : private base 
{ 
public: 
    void method() { base::method(); } 

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

我不太知道我理解你的第二個問題,不過是:你可以通過在派生類中更改基本成員無障礙using聲明。

+0

完美,謝謝..結合這與@DeadMG第二個問題的答案,我們可以標記問題解決.. – 2011-01-06 03:20:31

1

你不恢復訪問,本身。你設置訪問。如上所述,您可以明確設置任何方法的訪問權限,包括之前聲明爲private的方法。

1

如果派生類想要這樣做,那麼就不可能阻止保護方法公開,因爲您可以只寫一個小包裝並完成。 private是另一回事。

+0

akh ...是的..有道理..謝謝..我正在閱讀「C++完整參考文獻第四版」一章,並且有一段說明:「您可以使用訪問聲明來恢復訪問權限public和 成員,但是,您不能使用訪問聲明來提高或降低成員的訪問狀態,例如,在基類中聲明爲private的成員不能由派生類公開的 (如果允許使用C++這會發生,它會破壞它的封裝機制!)「..所以我認爲他的意思是爲公衆和保護被認爲是相同的水平.. – 2011-01-06 03:16:30