在一些情况下,二者都可以完成规定的任务,但是他们二者其实是有优先使用场景的区别的。
一.
类的内嵌:”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函数。
总结:
一辆车中有一个发动机,但是我们不会认为一辆车就是一个发动机。包含关系,整体-部分。
一辆卡车是一辆汽车,但是我们不会以为一辆卡车当中有一个汽车。递进关系,一般-特殊。