C++继承关系和复合关系

​  我们今天来讲一下类和类之间的关系,在类里面,分为了三种关系:

  1. 没有任何关系

  2. 继承关系(派生)

  3. 复合关系(类似于封闭类)

继承:“是”关系。

– 基类 A,B是基类A的派生类。

– 逻辑上要求:“一个B对象也是一个A对象”。

复合:“有”关系。

– 类C中“有”成员变量k,k是类D的对象,则C和D是复合关系

– 一般逻辑上要求:“D对象是C对象的固有属性或组成部分”

继承关系的使用

写了一个 CMan 类代表男人

后来又发现需要一个CWoman类来代表女人

CWoman类和CMan类有共同之处

就让CWoman类从CMan类派生而来,是否合适?

是不合理的! 因为“一个女人也是一个男人”从逻辑上不成立!

好的做法是概括男人和女人共同特点,

写一个 CHuman类,代表“人”,然后CMan和CWoman都从

CHuman派生。

复合关系的使用

 几何形体程序中,需要写“点”类,也需要写“圆”类

class CPoint{  double x,y;};class CCircle:public CPoint{  double r;};

  看上面两个类,一个是圆心类(x,y代表圆心的坐标),一个是圆类(由圆心类派生而来),那么我们可以用圆心来派生到圆这里面,这就是继承关系了,那一个圆是不是一个点呢?当然不合理了,那么正确的做法是什么呢?

 几何形体程序中,需要写“点”类,也需要写“圆”类,两者的关系就是复合关系 ---- 每一个“圆”对象里都包含

(有)一个“点”对象,这个“点”对象就是圆心

class CPoint{  double x,y;};class CCircle{  double r;  CPoint center;};

我们再来讲一个例子:

 如果要写一个小区养狗管理程序,

需要写一个“业主”类,还需要写一个“狗”类。

 而狗是有 “主人” 的,主人当然是业主(假定狗只有

一个主人,但一个业主可以有最多10条狗)

class CDog;class CMaster{  CDog dogs[10];};class CDog{  CMaster m;};

这样写可不可以呢?(当然不可以)

如果这样写的话,求一个类的体积就求不出来了,为什么呢?因为这两个类循环定义了!

另一种写法:

为“狗”类设一个“业主”类的成员对象;

为“业主”类设一个“狗”类的对象指针数组。

class CDog;class CMaster {  CDog * dogs[10];};class CDog {  CMaster m;};

两条狗可能有着同一个主人,如果我们要修改一个狗的主人信息,那么他的其他狗也需要修改,就有些啰嗦,是不对的(在以后学了数据结构后,可以用'并查集'来进行优化)

正确的写法:

为“狗”类设一个“业主”类的对象指针;

为“业主”类设一个“狗”类的对象指针数组。

class CMaster; //CMaster必须提前声明,不能先写CMaster类后写Cdog类class CDog {  CMaster * pm;};class CMaster {  CDog * dogs[10];}

这样一来,狗和人互相连接,就可以互相改变,达成了和谐的环境!

这就是我们今天要讲的C++继承关系和复合关系.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值