继承与构成::我的理解是否正确?

时间:2015-04-03 06:55:46

标签: c++

在合成中,一个类明确包含另一个类。但是在继承中,基类隐式包含在派生类中。正确与否?我问这个是因为经过几天的继承研究之后,我才知道在某个地方,派生类的对象总是包含它的基类对象。

我的意思是,我认为只有一个对象,只是功能会被继承,但我不知道它也会包含基类的对象。

6 个答案:

答案 0 :(得分:1)

在Composition中,一个对象包含另一个对象。在继承中,您的对象是获取基类的属性。

  

我的意思是,我认为只有一个物体而且只有物体   功能将被继承,但我不知道它也会   包含基类的对象。

是的,你是对的,只有一个对象和功能被继承。即使您的基类具有成员变量,也会将大小添加到您的对象大小。

您可以直接调用基类的公共方法和受保护方法。在联合收割机中,您只能访问公共方法。

答案 1 :(得分:1)

那应该是: 在合成中,一个类显式包含另一个类的对象。但是在继承中,基类隐式包含在派生类中。

简而言之: 构成是关于类和对象的关系。 继承是关于类和类的关系。

请记住“首选组合而不是继承”。 Prefer composition over inheritance?

答案 2 :(得分:1)

考虑代码:

class Engine
{
//Some Code
};

class Vehicle
{
//Some Code
};

class Car:Vehicle
{
    Engine engine;
    //Some Code
};

在这种情况下,Car类继承了Vehicle类。 Car类的对象不包含对象Vehicle,而是Vehicle类(继承)的对象。另一方面,它确实包含Engine(Composition)类的对象。

您可以使用this访问父级函数这一事实来自于Car对象是Vehicle而不是因为它包含Vehicle对象这一事实。

答案 3 :(得分:1)

通常派生类包含所有数据成员并共享基类的属性/方法,但组合和继承之间存在差异。

通过"组合"你的意思是一个对象"有"其他一些对象。例如:人类有肝脏。在课堂设计中,它可以如下所示:

class Liver {};

class Human
{
public:
  Human() {}
private:
  Liver mLiver;
}

在谈论继承时,有两种选择:公共继承粗略地说一个对象"是#34;一种其他的对象。例如:人类是一种生物。人们自然而然地说#34;里面的生物。在这种情况下,公共继承是一种方法:

class LivingCreature {};

class Human : public LivingCreature
{
public:
  Human() {}
}

其他选项是受保护/私有继承,应该用于实现某些对象""其他对象。一般来说,它也可以作为一种成分处理,但第一种方法通常更好。

汇总:

  • 如果你能说一个对象"是"一种其他更通用的对象:公共继承是最好的方法,
  • 如果你能说一个对象"有"其他对象:使用组合。

答案 4 :(得分:1)

  

在合成中,一个类明确包含另一个类。但是在继承中,基类隐式包含在派生类中。是否正确?

这完全是知识/观点的问题:如果您意识到继承意味着基类实例将嵌入派生类中,那么可以将class Dervived : Base视为明确请求,而如果您'请注意,在class X中定义变量意味着它是一个将包含在X实例中的成员变量,然后也可以将其视为显式。

  

我问这个是因为经过几天研究继承之后,我才知道在某个地方,派生类的对象总是包含它的[sic]基类的对象。

实际包含基类对象与通过一些更加未指定/神秘的方法之间的区别意味着有时可以替代基类实例,在开始学习继承时不一定是最重要的事情,因此很容易想象在所有学习材料中都没有强调它。

  

我的意思是,我认为只有一个对象,只是功能会被继承,但我不知道它也会包含基类的对象。

在实现级别,重要的是它实际上包含一个基类实例,因此编译为处理基类对象的代码在派生类实例上同样可以正常工作。 C ++标准可能认为它只是具有相同二进制布局的基类内容的嵌入式副本,而不是实际的基类对象,但是标准中的大量文本必须添加到提到派生对象可以在基类实例可接受的场景中使用。换句话说,这种区别在某种程度上是随意的,但如果它既直观又适合于更简单,更简洁的标准措辞,对每个人来说都更容易。

答案 5 :(得分:0)

  

继承与组合::我的理解是否正确?

概念差异:

<强>继承:

在继承的情况下,派生类基类的子类型。 这意味着如果您从Dog派生Animal,那么Dog Animal并且 可以在Animal上执行可以在Dog上执行的所有*操作。

  • 使用privateprotectedpublic继承,您可以控制知道 DogAnimal的人谁知道Animal的内部运作方式。如果只有protectedprivate继承,则Dog会知道它是Animal,但从外面看并不明显。

<强>成分:

在组成的情况下,一个类被包含在另一个类中。 Car不是Wheel。但它包含Wheel。因此,对Wheel起作用的操作不适用于Car

通过将Wheel类型的成员变量声明为publicprivateprotected,您可以控制哪些人可以访问Car Wheel

我相信这很清楚了吗?

实施细节:

对于C ++,基类的成员包含在派生类中。基类中存在的方法也可以在派生类中访问 - 某处。访问说明符privatepublicprotected AND继承类型确定哪些方法可见以及在哪里。

  

我认为只有一个对象

这是一个目标。

在microsoft编译器中,g ++对象被“合并”在一起,这意味着:

struct Base{
    int a;
};

strict Derived: public Base{
    int b;
};

Derived内部将可能(需要检查C ++标准以确定)具有此布局。

strict Derived{
    int a;
    int c;
};

struct Derived{
    Base _;
    int c;
};

在多重继承和钻石继承的情况下,事情会变得更复杂,基类可以多次包含。