通过已有类构造新类有多种方式,可以通过继承,组合或者是模板设计的方法等等。其中继承和组合是通过已有类构造新类的最基础的两种方式。它们都是使得已有对象成为新对象的一部分;其实,它们就是反映了两种不同的对象关系。
1.继承:
继承反映了“是一个”(is-a)的关系。比图类X是类Y的公有基类,那么,就表示每一个Y类型的对象都是一个X类型的对象;X类型 的对象与Y类型的对象是一般与特殊的关系(举个例子:钢笔是笔,笔是用来写字的,所以钢笔也能用来写字的)。通过公有继承,Y类的对象不仅包含了X类对象的全部数据,而且还包含了X类对象的所有接口。比如:
-
class Fish {//鱼
-
public:
-
void SpitBubble();//吐泡泡
-
void Breath();//呼吸
-
private:
-
……
-
}
-
-
class GoldFish : public Fish {//金鱼
-
public:
-
void showColor(); //金鱼的颜色
-
void Shape();//形状
-
……
-
private:
-
……
-
}
-
-
class Salmon : public Fish {//三文鱼
-
public:
-
void showColor(); //三文鱼的颜色
-
void Shape();//形状
-
……
-
private:
-
……
-
}
一条金鱼是一条鱼,一条三文鱼是一条鱼,金鱼和三文鱼都是特殊的鱼,它们都具有能够吐泡泡和呼吸的功能,鱼能做的事,它们都能做,它们还有各自的特点(颜色,形状不同等等)。
2.组合:
组合反映的是“有一个”的关系。如果类Y中内嵌了一个类X的对象,则表示每个Y类型的变量中都有一个X类型的对象。X类型的对象和Y类型的对象之间是部分与整体的关系。不过,Y类型的对象中虽然包括了X类型对象的全部数据内容,但其本身并不包含X类型对象的接口;因为,一般情况下,X类型的对象都是作为Y类型的私有成员存在的,如此,Y类中内嵌的X类对象的对外接口也就被Y类隐藏了,这些接口只能被Y类所用,不能直接作为Y类的对外接口。比如:
-
class Battery {//手机电池类
-
public:
-
void work();//电池运作
-
……
-
}
-
-
class SimCard {//SIM卡类
-
public:
-
void StoreNumber(int ID);//存储电话号码
-
……
-
}
-
-
class CellPhone {//手机类
-
public:
-
void Call(int Id);//拨号
-
……
-
private:
-
Battery battery;//手机电池
-
SimCard simcard;//SIM卡
-
……
-
}
上面的例子通过组合的方式,描述了一个手机有一块电池,一张SIM卡,手机是个整体,电池和SIM卡都是部分的,电池有供电的功能,SIM卡有存储号码的功能,这些功能都能够为手机整体所用,但是手机不再具有这样的功能,手机通过对电池,SIM卡的整合,具备了自己的功能——拨号的功能。
至于什么时候用组合?什么时候用继承?用继承的时候,又应该什么时候用公有继承,什么时候用保护继承,什么时候用私有继承呢?
(1)何时用组合,何时选继承?这就要分清楚“整体-部分”之间的“有一个”的关系,以及“特殊-一般”之间的“是一个”的关系。有时候,两个类之间的关系可能并不明显,此时,到底用组合还是继承,就要根据程序设计的实际需求来分析了,若是既可以选择组合又能用继承的方式,可以依据究竟是要把这个类抽象成什么来选择。
(2)用继承的时候,到底选择那种方式的继承呢,这也是视具体情况决定的;不过,只要是知道了三种不同的继承方式所带来的区别就好办了:
1)public方式继承:基类成员保持原来的自己的访问方式;
2)protected方式继承:基类中的public和protected成员在新的派生类中的访问方式均为protected方式;
3)private方式继承:基类中所有成员在派生类中均为private成员。
对于基类而言,其自身成员可以对基类中任意其他成员进行访问,但是通过基类的对象就只能访问其访问其公有成员。
派生类继承了基类中所有的数据成员,和除了构造函数以及析构函数之外的全部函数成员。从基类继承过来的成员,其访问方式由继承方式决定。
阅读(1961) | 评论(0) | 转发(0) |