2011-09-10 4 views
0

あなたが使用します。C++の継承の質問

  • プライベートコンストラクタ/デストラクタを?
  • 保護されたコンストラクタ/デストラクタ?

  • 保護された継承メインクラスですか?
    クラス名:保護されたメイン

  • プライベート継承メインクラス?
    クラス名:Privateメイン

それは広すぎるなら、私はちょうど開始のアイデアを探していて、あなたが、それを使用するかもしれない場所の1つのインスタンスの各質問のための単一の短い例することができます。

+0

私は、保護された継承は完全性のために存在するものの、本当に深刻な使用はないと考えています。私はあなたがいくつかのコンポーネントクラスから保護されて継承することによって基本クラスを構築するいくつかの状況を考案できると確信していますが、それは一般的なイディオムではありません。 –

+0

私は現在、継承/友人の問題を抱えているので、私はアイデアやソリューションを生み出すためにオプションを探求したいと考えています。 – SSight3

+0

この質問はあまりにも漠然としていますが、最善の答えは次のようなものです:*デザインがそれを指示する*、または*必要なとき* ...しかし、それは答えがあまりにも漠然としています...それは、それは本当に答えにはならない。 –

答えて

3
  • プライベートコンストラクタ/デストラクタ
    • See here for private destructorsが、あなたは誰があなたのクラスのインスタンスを構築したくないプライベートなコンストラクタ。
    • は私が保護されたデストラクタを知らないprotectedコンストラクタ/デストラクタが、これは内部クラスであり、あなたが唯一のクラスおよび/または友人のクラスをしたいprotectedコンストラクタ/関数とサブクラスをインスタンス化することができます。
  • 保護継承されたメインクラス
  • プライベート継承されたメインクラス
+0

クラスを継承するときに、Name:public Mainクラス(名前は実際のものではなく擬似名)を持つ場合はpublic型typenameを使用します。私はちょうどそれが適用されるかもしれないインスタンスで疑問に思っていますか? – SSight3

+0

@ SSight3ああ、そうだ。 http://www.parashift.com/c++-faq-lite/private-inheritance.html –

2

スコット・マイヤーズは、それをこのように説明して:

  • class D : public B: "Dは、インターフェイスB"を提供します。

  • class D : private BBを使用して「D」が実装されています。

  • (保護された継承はすべてが有用ではありません。)

protectedコンストラクタ/デストラクタはあなたが実装を提供するために、すなわち、第二の方法でのみ使用したいクラスに有用です他のクラス。その場合、派生クラスのみがコンストラクタとデストラクタを呼び出す必要があり、そのため保護することができます。

プライベートコンストラクタは、静的メンバ関数は、インスタンスへのポインタを返すが、クラスのインスタンスを直接構成がない場合、唯一のクラス自体は、工場又はクリエータパターンに人気のある、それ自体のインスタンスを作成することができることを意味希望。

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; 
} 

protectedコンストラクタ/デストラクタ?

あなただけのクラスのサブクラスを作成している場合(あなたのクラスは単なる抽象クラスですが、何の純粋仮想メソッドを持っていないので、それは理論的にインスタンス化することができれば、例えばそれpublicコンストラクタた):

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メソッドは、基本クラスの静的メソッドでもありますが、前方宣言の必要性のために少し複雑になります。また、別の方法として、A1とのコンストラクタを保護したままにして、AFactoryA1A2の友人にすることもできます。

保護された継承メインクラスですか? プライベート継承メインクラス?

Mainクラスの意味は?いずれにしても、非公開継承は集約に非常によく似ています。そうでない特別な理由がなければ、集約はプライベート/保護された継承よりも優先されるべきです。