2011-09-10 112 views
0

你打算什麼時候使用:C++繼承問題

  • 私有構造/析構函數?
  • 受保護的構造函數/析構函數?

  • 受保護的繼承主類?
    class Name:Protected Main

  • 私有繼承的主類?
    類名稱:Private主要

如果它過於寬泛,可以爲你在哪裏可以使用它,因爲我只是在尋找一個開始的想法一個實例的每一個問題一個簡單的例子。

+0

我想保護繼承是存在的完整性,但沒有真正有什麼嚴重的用途之一。我敢肯定,你可以設法通過繼承某些組件類的保護來構建基類,但這不是一個常見的習慣用法。 –

+0

我目前有繼承/朋友問題,所以我正在尋找探索選項以產生想法和解決方案。 – SSight3

+0

這個問題太模糊了,最好的答案是:*當設計規定它*,或者*需要時* ...但是對於答案來說太模糊...這是一個關於繼承的長篇教程這並不真正適合答案。 –

回答

3
  • 私有構造/析構函數
  • 受保護的構造函數/析構函數
    • 我不知道受保護的析構函數,但是當這是一個內部類,你只需要類和/或朋友類的受保護的構造函數/函數和子類能夠實例化自己。
  • 受保護的繼承主類
  • 私有繼承主類
+0

當繼承一個類時,如果您有類名稱:public Main(名稱是僞名稱,而不是實際名稱),那麼您具有公用類型名稱,這意味着您也可以擁有protected和private。我只是想知道哪些情況可能適用? – SSight3

+0

@ SSight3哦,我明白了。 http://www.parashift.com/c++-faq-lite/private-inheritance.html –

2

斯科特邁爾斯這樣解釋道:

  • class D : public B:「D提供接口B」。

  • class D : private B:「D使用B」來實現。

  • (保護繼承是不是所有的有用。)

受保護的構造函數/析構函數是有用的,你想僅在第二方式使用,即爲了提供實現的類其他類。在這種情況下,只有派生類需要調用構造函數和析構函數,這可能因此受到保護。

A private構造函數意味着只有類本身可以創建自己的實例,這對工廠或創建者模式很流行,其中靜態成員函數返回指向實例的指針,但直接構造類實例不是期望。

2

私有構造函數/析構函數?

私有構造/析構函數是有道理的,任何一種類是誰的對象實例應該通過其他經理類(例如具有它所管理的類的所有實例的列表)來管理。舉個例子:

class AManager; 

class A { 
    private: 
    friend class AManager; 

    A() {}; 
    ~A() {}; 
} 

class AManager { 
    public: 
    A* createA() { a = new A(); aList.add(a); return a; } 
    void destroy(A* a) { aList.remove(a); delete a; } 

    private: 
    list<A> aList; 
} 

受保護的構造函數/析構函數?

如果你只是想創建類的子類(例如,如果你的類只是一個抽象類,但沒有純虛方法,所以理論上可以被實例化有它的公共構造函數):

class A { 
    protected: 
    A() {}; 
    ~A() {}; 
} 

class A1: public A { 
    public: 
    A1() {} 
} 

class A2: public A { 
    public: 
    A2() {} 
} 

這使得最有意義作爲工廠圖案的一部分:

class AFactory { 
    public: 
    A* createA() { 
     if(someCondition()) return new A1(); 
     else return new A2(); 
    } 
    void destroyA(A* a) { delete a; } 
    private: 
    bool someCondition() { /*...*/ } 
} 

create/destroy種方法也可以是A基類的靜態方法,但由於需要前向聲明,它變得稍微複雜一些。另外,作爲替代方案,A1A2構造函數可以保持保護,並且AFactory成爲A1A2的朋友。

受保護的繼承主類? 私有繼承的主類?

您的意思是Main class?無論如何,非公有繼承與聚合非常相似,所以如果沒有一個非特定的原因,聚合應該優先於私有/受保護的繼承。