1 继承:“是”关系。
-- 基类A, B是基类A的派生类。
-- 逻辑上要求:‘一个B对象也是一个A对象’
2 复合:“有”关系。
-- 类C中“有”成员变量k,k是类D的对象,则C和D是复合关系
-- 一般逻辑上要求:“D对象是C对象的固有属性或者组成部分”
3 继承关系的使用
Human为基类,Man类和Woman类为其子类。
4 复合关系的使用
几何形体程序中,需要写点类,也需要写圆类。两者关系就是复合关系--每一个圆对象里都包含一个点的对象,这个点对象就是圆心。
class CPoint
{
double x, y;
friend class CCircle; // 使得在CCircle类中可以访问到CPoint类的私有成员变量,因此使用友元类。
};
class CCircle
{
double r;
CPoint center;
};
5 复合关系的使用案例
– 如果要写一个小区养狗管理程序,需要写一个“业主”类, 还需要写一个“狗”类。
– 而是有“主人”的, 主人当然是业主(假定狗只有一个业主,但一个业主可以最多有10条狗)
如何处理狗和业主关系?
做法一:(错误 原因是:循环定义 如果问一个CMaster对象是多少个字节?在计算过程中就会产生循环问题)
class CDog;
class CMaster
{
CDog dogs[10];
};
class CDog
{
CMaster m;
};
做法二:(可避免循环问题 CMaster对象中含有一个十个元素的数组,每一个元素都是一个指针,字节数就是四十个字节。同理CDog对象字节数也可以得到。)
(这种做法还是不对,原因:这种写法里,狗中有人,两条狗的主人有可能是一个人,因此产生一个问题:如何维护不同狗中相同主人信息一致性的问题)
(例如,改变其中一条狗中主人信息,另外一条狗跟这条狗主人相同,主人信息也要相应的进行修改。要维护相同主人的多条狗里面所包含的多个主人对象的信息一致性是一件很啰嗦的事情。)
为“狗”类设计一个“业主”类的成员对象;
为“业主”类设计一个“狗”类的对象指针数组
class CDog;
class CMaster
{
CDog* dogs[10];
};
class CDog
{
CMaster m;
};
做法三:(凑合的写法)人中有狗
为“狗”类设计一个“业主”类的对象指针;
为“业主”类设计一个“狗”类的对象数组。
class CMaster;
class CDog
{
CMaster* pm;
};
class CMaster
{
CDog dogs[10];
};
做法四:(正确的)
为“狗”类设计一个“业主”类的对象指针
为“业主”类设计一个“狗”类的对象指针数组
class CMaster;
class CDog
{
CMaster* pm;
};
class CMaster
{
CDog* dogs[10];
}