爲什麼有人會聲明構造函數受保護?我知道構造函數被宣佈爲私有的,目的是不允許它們在堆棧上創建。受保護構造函數的實際用途是什麼?
56
A
回答
73
當一個類是(打算作爲)一個抽象類時,受保護的構造函數是完全正確的。在這種情況下,你不希望從類中實例化對象,而只是使用它來繼承。
還有其他用例,例如某些構造參數應限制爲派生類。
11
一個用途是使用構造工廠模式
6
甲受保護的構造意味着只有派生成員可以構造類(和衍生的實例)的實例。這聽起來有點雞與雞蛋,但在實施班級工廠時有時很有用。
3
讓子類使用不應該直接訪問實例化器的構造函數。
3
你可以用它來限制可以創建它的類,例如:
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
,它可以創建它的一個實例中唯一的類是LevelManager類,所以你將永遠知道水平實例在LevelManager中創建。
7
非公開構造函數在有構造函數無法保證的構造要求時非常有用。例如,如果需要在構造函數之後立即調用初始化方法,或者如果對象需要向某個容器/管理器對象註冊自己,則必須在構造函數之外完成此操作。通過限制對構造函數的訪問並僅提供工廠方法,您可以確保用戶收到的任何實例都將履行其所有保證。這也通常用於實現一個單例,這實際上是類的另一個保證(只有一個實例)。
使構造函數受到保護(而不是私有)的原因與使其他方法或字段受保護而不是私有相同:因此它可以由子項繼承。也許你想在基類中使用公共的非虛擬工廠方法,它返回對派生類實例的引用;派生類顯然需要訪問父構造函數,但您仍然不想在工廠外創建它們。
2
對於具有副作用的工廠方法。
class mine {
private:
mine() {};
protected:
mine(int id) : m_id(id) {};
int m_id;
static int m_count;
public:
static mine* CreateOneOfMe() {
return mine(m_count++);
}
int GetId() { return m_id; }
};
這創建了類的實例並確保它們中的每一個都具有唯一的遞增整數id。請注意,如果您要使用的構造函數不是默認構造函數,則您也必須隱藏默認構造函數。
5
受保護的構造函數可用於在沒有任何方法是純虛擬時有效地抽象類。
它在C++中並不是很抽象,因爲朋友類仍然可以使用它而不會覆蓋,但是接下來你將不得不聲明這些。
相關問題
- 1. 受保護的構造函數是否被認爲是良好的實踐?
- 2. 什麼是System.Transactions的實際用途?
- 3. jQuery的實際用途是什麼?
- 4. toContain()的實際用途是什麼?
- 5. C#中外部靜態構造函數的用途是什麼?
- 6. 靜態構造函數的用途是什麼?
- 7. Java類構造函數中尖括號的用途是什麼?
- 8. 不同Intent構造函數的用途是什麼?
- 9. 使用make_shared與受保護的構造函數+抽象接口
- 10. 能夠用受保護的構造函數創建一個var?
- 11. 如何在c#中調用受保護的構造函數?
- 12. 休眠使用受保護的默認構造函數失敗
- 13. 是否可以使用Unity將參數注入受保護的構造函數?
- 14. 受保護的抽象基類的構造函數和析構函數?
- 15. C中的繼承樹和受保護的構造函數#
- 16. 關於受保護的構造函數的查詢
- 17. DataRow和受保護的內部構造函數
- 18. 受保護的斯卡拉內部類構造函數
- 19. 複製構造函數實際上做了什麼?
- 20. 什麼是守護進程?他們的實際用途?用法與PHP?
- 21. C++類構造函數定義public,表示它是受保護的
- 22. 爲什麼抽象類的構造函數應該受到保護,而不是公共的?
- 23. 在構造函數中初始化集合有什麼用途
- 24. 構造函數鏈的用途?
- 25. Coq中的構造函數是什麼?
- 26. goto的可接受用途是什麼?
- 27. node-gyp build error「在mac上調用類」v8 :: HandleScope「的受保護構造函數
- 28. JUnit測試用例中「失敗」的實際用途是什麼?
- 29. div()庫函數的用途是什麼?
- 30. 函數try塊的用途是什麼?
從技術上講,這隻適用於所有ctors都受到保護的情況。 – MSalters 2009-06-29 09:09:42
朋友類也可以調用受保護的構造函數(不僅僅是派生類)。 – 2013-09-29 03:48:32
...並且調用受保護的構造函數的朋友類的使用將是對象具有常量(由構造函數設置)的成員的情況,但需要公開,但絕不會被其他公共訪問設置,從而保證該對象不會在其他地方創建,因此數據也不會在其他地方被修改。 – osirisgothra 2014-03-02 17:37:53