2015-01-02 17 views
0

如果問題是重複,請原諒我......我無法獲得令人滿意的答案,因此將任務發佈到我的方式....爲什麼我們不能在派生類函數中創建基類對象如果基​​類構造函數受保護

考慮示例代碼

class Base { 
protected: 
    Base() {} 
}; 
class Derived:public Base { 
public: 
    void func() { 
     Base obj; 
    } 
}; 

上面的代碼將thow編譯錯誤說法基本的構造函數是受保護的。 但是,如果我在主要的基類的構造函數中創建一個派生類對象(我知道它由派生類構造函數內部調用),這意味着可以從派生類函數調用基類構造函數。 那麼爲什麼我們無法在派生類函數內創建一個Base類對象...?

還有一件事....是否有任何其他方式來實例化一個類的對象,它的構造函數在protected中,除了在同一個類的方法內部(就像我們在創建Singleton時一樣)...?

回答

2

訪問類型protected只允許訪問從您的父類繼承的「您自己的」成員。與例如Java,C++對此概念有相當嚴格的解釋,允許您只訪問同一實例的繼承成員。

通過使用構造函數,您在技術上試圖訪問另一個實例的非公開實現細節,這是禁止的。

+0

那麼是否有其他方法來實例化一個類的對象,該類的構造函數在protected中,而不是基類的靜態公共方法(即創建Singleton) –

2

一個錯誤是認爲您正在有效地嘗試訪問受保護的基類成員。你沒有那樣做。你正試圖用一個標記爲protected的構造函數創建一個類的實例。通過將構造函數標記爲受保護的,您特別禁止構建該類的實例。這隻有在派生類的構造函數中才有可能。這就是爲什麼你發現它在main()計劃中工作。

創建實例Base而不移除受保護的說明符的唯一方法是創建一個Derived的實例,該實例是「Base」的一個實例。或者創建另一個派生類,它不會將任何重寫的行爲添加到「Base」中。

相關問題