Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1405483
  • 博文数量: 120
  • 博客积分: 182
  • 博客等级: 入伍新兵
  • 技术积分: 2278
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-19 16:31
文章分类

全部博文(120)

文章存档

2015年(12)

2014年(13)

2013年(40)

2012年(55)

分类: C/C++

2013-12-05 16:13:41

          通过已有类构造新类有多种方式,可以通过继承,组合或者是模板设计的方法等等。其中继承和组合是通过已有类构造新类的最基础的两种方式。它们都是使得已有对象成为新对象的一部分;其实,它们就是反映了两种不同的对象关系。
       1.继承:
        继承反映了“是一个”(is-a)的关系
。比图类X是类Y的公有基类,那么,就表示每一个Y类型的对象都是一个X类型的对象;X类型   的对象与Y类型的对象是一般与特殊的关系(举个例子:钢笔是笔,笔是用来写字的,所以钢笔也能用来写字的)。通过公有继承,Y类的对象不仅包含了X类对象的全部数据,而且还包含了X类对象的所有接口。比如:
  1. class Fish {//
  2. public:
  3.        void SpitBubble();//吐泡泡
  4.        void Breath();//呼吸
  5. private:
  6.       ……
  7. }

  8. class GoldFish : public Fish {//金鱼
  9. public:
  10.       void showColor(); //金鱼的颜色
  11.       void Shape();//形状
  12.       ……
  13. private:
  14.        ……
  15. }

  16. class Salmon : public Fish {//三文鱼
  17. public:
  18.       void showColor(); //三文鱼的颜色
  19.       void Shape();//形状
  20.       ……
  21. private:
  22.       ……
  23. }
一条金鱼是一条鱼,一条三文鱼是一条鱼,金鱼和三文鱼都是特殊的鱼,它们都具有能够吐泡泡和呼吸的功能,鱼能做的事,它们都能做,它们还有各自的特点(颜色,形状不同等等)

        2.组合:
        组合反映的是“有一个”的关系。如果类Y中内嵌了一个类X的对象,则表示每个Y类型的变量中都有一个X类型的对象。X类型的对象和Y类型的对象之间是部分与整体的关系。不过,Y类型的对象中虽然包括了X类型对象的全部数据内容,但其本身并不包含X类型对象的接口;因为,一般情况下,X类型的对象都是作为Y类型的私有成员存在的,如此,Y类中内嵌的X类对象的对外接口也就被Y类隐藏了,这些接口只能被Y类所用,不能直接作为Y类的对外接口。
比如:
  1. class Battery {//手机电池类
  2. public:
  3.      void work();//电池运作
  4.      ……
  5. }

  6. class SimCard {//SIM卡类
  7. public:
  8.       void StoreNumber(int ID);//存储电话号码
  9.       ……
  10. }

  11. class CellPhone {//手机类
  12. public:
  13.      void Call(int Id);//拨号
  14.      ……
  15. private:
  16.      Battery battery;//手机电池
  17.      SimCard simcard;//SIM卡
  18.      ……
  19. }
上面的例子通过组合的方式,描述了一个手机有一块电池,一张SIM卡,手机是个整体,电池和SIM卡都是部分的,电池有供电的功能,SIM卡有存储号码的功能,这些功能都能够为手机整体所用,但是手机不再具有这样的功能,手机通过对电池,SIM卡的整合,具备了自己的功能——拨号的功能。
至于什么时候用组合?什么时候用继承?用继承的时候,又应该什么时候用公有继承,什么时候用保护继承,什么时候用私有继承呢?
(1)何时用组合,何时选继承?这就要分清楚“整体-部分”之间的“有一个”的关系,以及“特殊-一般”之间的“是一个”的关系。有时候,两个类之间的关系可能并不明显,此时,到底用组合还是继承,就要根据程序设计的实际需求来分析了,若是既可以选择组合又能用继承的方式,可以依据究竟是要把这个类抽象成什么来选择。
(2)用继承的时候,到底选择那种方式的继承呢,这也是视具体情况决定的;不过,只要是知道了三种不同的继承方式所带来的区别就好办了:
1)public方式继承:基类成员保持原来的自己的访问方式;
2)protected方式继承:基类中的public和protected成员在新的派生类中的访问方式均为protected方式;
3)private方式继承:基类中所有成员在派生类中均为private成员。
对于基类而言,其自身成员可以对基类中任意其他成员进行访问,但是通过基类的对象就只能访问其访问其公有成员。
派生类继承了基类中所有的数据成员,和除了构造函数以及析构函数之外的全部函数成员。从基类继承过来的成员,其访问方式由继承方式决定。
阅读(1961) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~