Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从基类c++;_C++_Inheritance - Fatal编程技术网

C++ 如何从基类c++;

C++ 如何从基类c++;,c++,inheritance,C++,Inheritance,在子类中,我需要从基类复制字段。一个简单的例子:如果我们有一辆基类车,我想制造一辆名为DoubleCar的车,它代表一辆车中的两辆车(有两个发动机、8个车轮等)。这辆双轮车将像一辆汽车一样运行(我们可以启动它、加速、刹车等),因此继承似乎很自然。我试着用下面的方法做 class Engine{ public: void Start(){} }; class Car { Engine* engine; public: Car(Engine* engine){this->e

在子类中,我需要从基类复制字段。一个简单的例子:如果我们有一辆基类
,我想制造一辆名为
DoubleCar
的车,它代表一辆车中的两辆车(有两个发动机、8个车轮等)。这辆
双轮车
将像一辆汽车一样运行(我们可以启动它、加速、刹车等),因此继承似乎很自然。我试着用下面的方法做

class Engine{
  public: void Start(){}
};
class Car
{
    Engine* engine;
public:
    Car(Engine* engine){this->engine=engine;}
    virtual void Start(){engine->Start();}
};
并创建
DoubleCar
,其中包含基类中的第一个car和
secondCar
as字段:

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();}
};
这也不是一个好的解决方案。对于这样的问题,什么样的设计才是好的?当然,在我的实际问题中,我很少有父母的<代码>汽车< /代码>和几个孩子,所以我在一个等级树的中间。

< P>我觉得一辆“双车”就像一辆卡车一样,你试图强行注入一个继承关系只是扰乱了你的概念模型。 例如,您的“双车”不包含两辆车。它包含两倍于普通汽车的发动机和两倍于普通汽车的车轮,但它不包含两辆汽车

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


如果您迫切需要一个共享界面,我只会选择“车辆”级别,提供一个纯虚拟的
启动
以及您拥有的任何其他功能。

一般来说,继承模型是一种“关系”。这通常是从广义基类到更具体的派生类。例如:汽车是一种交通工具。福特野马是一辆汽车。所以,为了建模,你可能会得到一个基本类的车辆,然后是一个派生类的汽车,然后是一个派生类的福特野马

现在如果我们想说“双人汽车就是汽车”,那听起来有点奇怪。不仅仅是一辆车。两个

如果我们说“一辆双人汽车由两辆汽车组成”,那听起来很合理。因此,一个可能最终会有一个双人汽车班,有两个汽车成员。这更接近你的最后一个想法,但不是从汽车中衍生出来的

在这一点上,如果我正在编写代码,我会开始质疑我的设计。DoubleCar真的有什么理由从Car继承吗?“拥有相同的成员函数”是不够的。您是否需要通过一个接口向DoubleCar提供数据,该接口接受一个Car引用或指针?如果不是,那么它可能根本就不应该来自汽车。在这种情况下,构图思想起作用,DoubleCar本质上是一种汽车容器


但是,在不了解您实际处理的具体情况的情况下,我不确定我是否能给出更好的想法。

因此,创建继承似乎是很自然的。
似乎您很快就得出了这个结论:/特别是当您继续使用半继承,然后假装继承时
DoubleCar
应具有与
Car
相同的功能,这就是我得出此结论的原因。@petar为了您的代码使用,请不要处理原始指针yourself@Petar:100米短跑也有一个
Start()
member函数;这并不意味着它必须继承自
Car
。它是否代表一辆独特的
汽车
?多辆
汽车
?根据一些常识,你会发现它不应该同时代表两者。当您从
汽车继承时
,它不应变成
多功能汽车
,否则您会因为忽略上一个问题的答案而侵犯您的设计。如果
Car
multiplecar
将共享公共属性(特征)和方法(行为),那么您可能需要创建一个新的基本类型以满足这两个需求。
/** 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(); }
};