继承和组合的区别是什么?

7
如标题所述,我对两者的含义都不清楚。

可能是继承和组合的区别的重复问题。 - nawfal
观看这个演讲,你就会明白:https://youtu.be/29MAL8pJImQ?t=1380 - EpicPandaForce
8个回答

3

继承表达的是is-a关系,而组合表达的是两个类之间的has-a关系。

一个组合的例子是多边形。它有一个有序的点序列。用C++术语来说:

struct Polygon {
  std::vector<Point> points;
};

尽管logic_error是一种异常

struct logic_error : public exception {
};

1
跟我说:“梅赛德斯是一辆汽车。它有四个轮子。”反过来就没有意义了。 - sbi
@sbi 我尽力不使用任何关于狗、狗主人或汽车的例子,只是采用了我目前正在处理的简化版本。你毁了它 :( - pmr
我注意到了,决定还是加上一个。:) - sbi
@AlirezaRahmani 这是一个非常简短且不太有建设性的评论。请分享您的见解,并考虑阅读 https://en.wikipedia.org/wiki/Is-a 和 https://en.wikipedia.org/wiki/Has-a。 - pmr

2

只需谷歌搜索继承与组合,您将得到很多结果。
以Java为例

public class Banana extends Fruit{ //<---Inheritance Banana is-a Fruit
    private Peel bananaPeel; //<--Composition banana has a Peel
    public Peel getPeel(){
        return bananaPeel;
    }
}

1

继承意味着从父类中继承某些东西。例如,你可能会继承你母亲的眼睛或者继承你父亲的体型。

它意味着从父类中派生属性、特征和行为。所以你可以使用parent.walk()、parent.sleep()、parent.eat()或者其他方法。

容器或者组合可能有点难以解释。

或者说一辆汽车有刹车。汽车由刹车组成。但是刹车并没有从刹车中继承...这是不同的概念。我知道这个解释很奇怪...但我想这就是我能做到的了。

让我们看一下这段代码:

class Parent 
{
   public :
     void sleep() ; void eat() ; void walk()  ; 
     string eyeColor; int height ; 
};

class Child: public Parent
{

}

因此,子类可以继承父类的函数和属性,但当然它可能会有母亲或父亲的眼睛颜色。即使孩子的属性不同,它仍然可以做父类能做的任何事情。

现在组合是另一回事。一个孩子可以拥有一个玩具,或者一个父母可以拥有一个孩子。所以我可以这样做:

class Toy
{
  string model ; 
};

class Child
{
   Toy transformersToy ;
};

所以孩子现在有变形金刚玩具了...但是孩子继承了transformersToy.model属性吗?没有,因为它没有被继承。


唉,为什么这么多人都要用“愚蠢”的例子来解释继承?你的父母现在不能玩具了,我们的孩子也不能成长为父母等等。哈哈哈。 - Angel O'Sphere

1
正如pmr所指出的那样,继承是一种“is-a”关系,组合是一种“has-a”关系。
组合通常用于包装类和表达相互包含的类之间的关系。
继承用于多态,其中您有一个基类并且想要扩展或更改其功能。

0

继承是动态多态性,这些天改变了其功能,成为代码重用的一种技术。但组合是确保实现能力的一种技术。


0
我看到的一个主要观点是对象的所有权。继承并不拥有/给予任何东西,它只是给出基类的特征。而组合则将所有权赋予所创建的对象。
在第一个例子中,多边形具有点的向量。因此,多边形拥有/包含其中的点。 而在继承中,您可以使用/扩展基类的现有特征。

0

继承是类之间的关系,而容器关系是类实例之间的关系。


0
在内存管理方面,基类实例位于派生类之前,因此它们的地址相同。它们之间的区别在于关系类型: - 在继承中我们有“is-a” - 在组合中我们有“has-a”,如前所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接