質問に基づいて、私の考えは、継承を使用しないことが最善の方法であるということです。継承を使用publicしてクラス階層を定義します。多くの場合、合成が優れたオプションであるため、コードの再利用の手段として使用する場合は十分に注意してください。
- コメントで示唆されているように、を検討して
std::vectorください。
std::vector必要な操作がすべて揃っていない場合は<algorithms>、ニーズを満たしているかどうかを確認してください。
- それでもニーズが満たされない場合は、コレクション操作をメンバー関数ではなくフリー関数として作成することを検討してください。適切なデカップリングを使用すると、これらの操作は、
std::vector<Person>またはの配列で機能しPersonます。
- 非常に特殊な動作のコレクションが必要な場合は、
Personscompositionを使用してください。質問の説明は、構成が正しいことを意味します:「両方の配列を含む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特別な種類であると主張することができます。EllipseSquareRectangle
- それらは同じメンバー関数を持っています:
width()とheight()。
ただし、それをしないでください! 幅や高さが異なるなどEllipse、できないことを実行できます。CircleしたがってCircle、一種の。であってはなりませんEllipse。