2016-07-21 7 views
1

私は、オブジェクトとオブジェクトのコレクションが同じように動作する場合があります。だから私は、クラスをしたオブジェクトを表すために:構図と継承を一緒に使うにはどうすればいいですか?

class A { 
public: 
    virtual void foo(); 
protected: 
    int x; 
}; 

そしてオブジェクトのコレクションを表すために、私は別のクラスをしました:

class Collection: public A { 
    void foo(); //override base class function 
private: 
    vector<A*> aList; 
} 

これは罰金ですが、問題はそのコレクションクラスです私が必要としないA :: xのコピーを持っています。私はクラスコレクションがデータメンバーを継承しないようにしたい。これをどのように達成するのですか?

注:ライブラリからのものであるため、「クラスA」は編集できません。 修正:私はAのインターフェースを変更することができません。Aは残りのコードで使用されています。私は実装を変更することができます。既に仮想ではない場合、A :: anyFunction()をvirtualに変更できます。プライベートメンバーを保護対象に変更することができます。

+0

を 'コレクション:: x'と 'A :: x'は同じ' x'です。 – LogicStuff

+0

私はそれを理解しています。しかし、コレクションクラスでそのデータメンバーを望んでいません。 –

+0

多形Aを期待する関数を編集できますか? – StoryTeller

答えて

1

あなたは、インターフェイスを使用することができます:あなたカント編集した場合、あなたはまだラッパーを書くことで、インタフェースを使用することができA

class AInterface { 
public: 
    virtual void foo() = 0; 
}; 

、その後

class A : public AInterface { 
    /*...*/ 
}; 

class Collection : public AInterface { 
    /*...*/ 
}; 

を:

class AWrapper : public AInterface { 
    void foo() { a.foo(); } 
private: 
    A a; 
}; 
+0

私はちょうどメモを追加しました。私はクラスAを編集できません。 –

+0

@PramodT私はそれを見て答えを編集しました – user463035818

関連する問題