在子类中,我需要从基类中复制字段。一个简单的例子:如果我们有一个基类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/