質問に基づいて、私の考えは、継承を使用しないことが最善の方法であるということです。継承を使用public
してクラス階層を定義します。多くの場合、合成が優れたオプションであるため、コードの再利用の手段として使用する場合は十分に注意してください。
- コメントで示唆されているように、を検討して
std::vector
ください。
std::vector
必要な操作がすべて揃っていない場合は<algorithms>
、ニーズを満たしているかどうかを確認してください。
- それでもニーズが満たされない場合は、コレクション操作をメンバー関数ではなくフリー関数として作成することを検討してください。適切なデカップリングを使用すると、これらの操作は、
std::vector<Person>
またはの配列で機能しPerson
ます。
- 非常に特殊な動作のコレクションが必要な場合は、
Persons
compositionを使用してください。質問の説明は、構成が正しいことを意味します:「両方の配列を含む2つのクラス...」
継承に関して、is-classA
コレクション-ofPersons
およびis-classB
コレクション-ofの場合、動作が異なる共通メソッドのセットが前提条件と事後条件の共通セットを維持できる場合は、継承Persons
を検討します。public
たとえば、とを考えてみましょEllipse
うCircle
。
class Ellipse
{
// Set the width of the shape.
virtual void width( unsigned int );
// Set the height of the shape.
virtual void height( unsigned int );
};
class Circle
{
// Set the width of the shape. If height is not the same as width, then
// set height to be equal to width.
virtual void width( unsigned int );
// Set the height of the shape. If width is not the same as height, then
// set width to be equal to height.
virtual void height( unsigned int );
};
Circle
から派生したことは非常に魅力的Ellipse
です:
- プログラミング以外では、aが特別な種類であるのと同じように、それは
Circle
特別な種類であると主張することができます。Ellipse
Square
Rectangle
- それらは同じメンバー関数を持っています:
width()
とheight()
。
ただし、それをしないでください! 幅や高さが異なるなどEllipse
、できないことを実行できます。Circle
したがってCircle
、一種の。であってはなりませんEllipse
。