基于这个问题,我的想法是最好的方法是不使用继承。使用public
继承来定义类层次结构。将其用作代码重用的手段时要非常谨慎,因为通常情况下,组合是更好的选择。
- 正如评论中所建议的,考虑一个
std::vector
.
- 如果
std::vector
没有所有所需的操作,请检查是否<algorithms>
满足您的需求。
- 如果您的需求仍未满足,请考虑将集合操作编写为自由函数而不是成员函数。通过适当的解耦,这些操作可以
std::vector<Person>
在Person
.
- 如果您必须拥有
Persons
具有非常特定行为的集合,请使用组合。问题描述暗示组合是正确的:“两个类都包含一个数组......”
关于继承,如果classA
is-a collection-ofPersons
和classB
is-a collection-of Persons
,则考虑public
继承,如果行为不同的一组通用方法可以支持一组通用的前置条件和后置条件。例如,考虑一个Ellipse
and 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
:
- 在编程之外,有人可能会说这
Circle
是一种特殊的Ellipse
,就像 aSquare
是一种特殊的Rectangle
。
- 它们甚至具有相同的成员函数:
width()
和height()
.
但是,不要这样做! Ellipse
可以做Circle
不能做的事情,例如具有不同的宽度和高度;因此Circle
不应该是一种Ellipse
。