在子类中,我需要从基类中复制字段。一个简单的例子:如果我们有一个基类Car,我想制造一辆叫DoubleCar的汽车,它代表两个汽车合二为一(有两个引擎,8个轮子等)。该DoubleCar的作用类似于汽车(我们可以启动,加速,制动等),因此继承似乎很自然。我尝试通过以下方式进行

class Engine{
  public: void Start(){}
};
class Car
{
    Engine* engine;
public:
    Car(Engine* engine){this->engine=engine;}
    virtual void Start(){engine->Start();}
};


并创建具有基类的第一辆汽车和DoubleCar作为字段的secondCar

class DoubleCar : public Car
{
    Car* secondCar;
public:
    DoubleCar(Engine* e1, Engine* e2) : Car(e1)
    {secondCar = new Car(e2);}
    virtual void Start(){Car::Start(); secondCar->Start();}
};


这种解决方案看起来很丑陋,似乎一辆汽车比另一辆汽车更重要。我也试图将两辆车都放在野外而忽略基地成员,像这样

class DoubleCar1 : public Car
{
    Car *firstCar, *secondCar;
public:
    DoubleCar1(Engine* e1, Engine* e2) : Car(NULL)
    {firstCar = new Car(e1); secondCar = new Car(e2);}
    virtual void Start(){firstCar->Start(); secondCar->Start();}
};


这也不是一个好的解决方案。对于这样的问题,什么是好的设计?当然,在我的实际问题中,我没有几个Car的父母和几个孩子,因此我身处一棵树丛中。

最佳答案

在我看来,“双人汽车”就像卡车一样“汽车”,而您强行注入继承关系的企图只是弄乱了您的概念模型。

例如,您的“双人车”不包含两辆车。它包含的发动机和轮子的数量是普通汽车的两倍,但不包含两辆汽车。

我将完全失去与Car的关系,而只专注于组成那些可重用的组件类型(例如Engine):

/** Has "car" in the name, but isn't a car. Cars are single-engined. */
class DoubleCar
{
    Engine e1, e2;

public:
    virtual void Start() { e1.Start(); e2.Start(); }
};


如果您迫切需要一个共享接口,那么我将在“车辆”级别上走得更远,提供纯虚拟的Start以及您拥有的其他任何东西。

关于c++ - 如何从基类C++复制字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21077963/

10-15 07:03