中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第五周 继承 笔记 之 继承关系和复合关系

第五周 继承
1.继承和派生的基本概念
2.继承关系和复合关系
3.覆盖和保护成员
4.派生类的构造函数
5.公有(public)继承的赋值兼容原则

2.继承关系和复合关系

类和类之间可能存在的关系有三种: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派生。

复合关系的使用

例子1:
几何形体程序中,需要写“点”类,也需要写“圆”类,两者的关系就是复合关系 ---- 每一个“圆”对象里都包含
(有)一个“点”对象,这个“点”对象就是圆心。

class CPoint
{
	double x,y;
	friend class CCircle;
	//便于Ccirle类操作其圆心
};
class CCircle
{
	double r;
	CPoint center;
};

例子2:
如果要写一个小区养狗管理程序,需要写一个“业主”类,还需要写一个“狗”类。而狗是有 “主人” 的,主人当然是业主(假定狗只有一个主人,但一个业主可以有最多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];
};

有两个问题:1)复合关系的定义是“D对象是C对象的固有属性或组成部分”,不能说狗类的对象是主人类的固有属性,指针表示的拥有关系才是固有属性;2)狗类失去了自由,狗类对象都别被包含在主人类中了,所有对狗类的操作都要通过主人类才行。

正确的写法:
为“狗”类设一个“业主”类的对象指针;
为“业主”类设一个“狗”类的对象指针数组。

在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值