在一些情况下,二者都可以完成规定的任务,但是他们二者其实是有优先使用场景的区别的。
一.
类的内嵌:”has-a” 的关系,如果类b中嵌入一一个类a的对象,那么就说明每一个类b的对象中都包含有一个类a的对象。是整体和部分的关系,b类对象包含了a类全部的数据,但不包括a类对象的对外接口。
示例程序:
class engine{
public:
void work(){} //发动机转动
};
class car{
public:
void move(){} //汽车移动
private:
engine e; //汽车发动机
}
通过上面的示例程序,我们不难看出,发动机是汽车的整体,发动机有运转的功能,但是汽车不再具有这样的功能,汽车对发动机的整合,具备了自己的功能---move。 但是发动机的work函数接口被磨掉了,也就是说我实例化一个car类对象之后不能加 . 操作符直接访问work函数。
二.
类的继承:“is-a”的关系,如果类b继承了类a,这表示每一个类b对象都是一个特殊的类a对象。是一般和特殊的关系。 类b不仅包含了类a的全部数据,还包含了类a的全部接口。
示例程序:
class truck:public car{
public:
void load(){} //装货
void dump(){}//卸货
}
通过上面的示例程序,我们不难看出,卡车只是一种特殊的车,它不仅可移动,还可以装卸货,并没有把我原来的car类的move接口给抹掉。我仍然可以直接通过truck类型的对象来访问car中的move函数。
总结:
一辆车中有一个发动机,但是我们不会认为一辆车就是一个发动机。包含关系,整体-部分。
一辆卡车是一辆汽车,但是我们不会以为一辆卡车当中有一个汽车。递进关系,一般-特殊。
本文详细解释了类的内嵌(has-a)和继承(is-a)的概念,通过示例程序展示了它们的区别。has-a关系体现在一个对象包含另一个对象,如汽车包含发动机,而is-a关系则表示一种一般与特殊的关系,如卡车是汽车的一种。总结指出,类的内嵌是整体与部分的关系,而继承是递进的一般到特殊的关系。

被折叠的 条评论
为什么被折叠?



