2011-12-07 14 views
2

2つの抽象クラス間の構成(アグリゲーションではない)の関係を構築することは可能ですか?抽象クラス間の合成

私は抽象クラスをインスタンス化できないので、私はそうは思わない。しかし、おそらくそれを行う簡単な方法があります。

答えて

4

はい:あなたは抽象型へのポインタを持つことが許可されている

class A 
{ 
    virtual ~A() = 0; 
}; 


class B 
{ 
    virtual ~B() = 0; 
    A* mA; 
}; 

+0

AとBの間の集計ではありませんか? mAはBの外では生きていませんか? mAの寿命の責任を作成するにはBに関して、私はB ::〜B {delete mA;}を置くべきです...それは正しいですか? (virtual〜B()とvirtual〜B()= 0ではない) – Ale

+0

は必要ありません。責任は論理的なものです。 Bの中にmAを作成する必要はありません。あなたはそれを外部から割り当てて、それを破壊する責任をクラス外のものに委譲することができます。 –

0

他のクラスへのポインタまたは参照を使用できます。たとえば、次のC++ 11では

class A { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 
}; 

class B { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 

private: 
    boost::scoped_ptr<A> a; 
}; 

あなたの代わりにstd::unique_ptrを使用することができます。これにより、Bはコピー不可能になることに注意してください。これは、サブタイプ多型を使用するクラスでは多少共通です。

+0

aをプライベートメンバーとして宣言しました。 Bは抽象的なので、保護されていると宣言するのではないでしょうか? – Ale