17221070411-陈国佳总结《2017年12月8日》【连续059天】
标题:继承和复合关系,覆盖和保护成员;
内容:
A.继承关系和复合关系:
a).继承:“是”关系
1.基类A,B是基类A的一个派生类;
2.逻辑上要求:“一个B对象也是一个A对象”;
使用:如果我们已经定义了类MAN,又想要定义类WOMAN,这两类有共同之处,但我们不能使其中一类成为另一类的派生类,逻辑上不合理,
所以要先定义一个基类HUMAN;
b).复合:“有”关系
1.类C中“有”成员变量k,k是类D的对象,则C和D是复合关系;
2.逻辑上要求:“D对象是C对象的固有属性或组成部分”;
举例讨论:
1.写一个点类,在写一个圆类;
通过继承:class CPoint {double x,y;}; class CCircle::public CPoint{double r;};
错误,因为一个圆并不是一个点;
应该改为复合:class CPoint {double x,y;}; class CCircle{ double r; CPoint center;};
2.写一个小区管理程序,需要定义一个“业主类”,一个“狗”类;狗有一个主人(业主),业主可至多拥有10条狗;
复合关系:
(1)class CDog;class CMaster{ CDog dogs[10]}; class CDog{ CMaster m;};
循环定义,出错!
(2)class CDog;class CMaster{CDog*dogs[10];}; class CDog{CMaster m;};
//当我们修改一条狗的主人时,也要修改其主人的其它狗,过于麻烦;
(3).class CMaster; class CDog{CMaster*pm;}; class CMaster{CDog dogs[10];};
//当我们修改狗时,必须通过其主人,可行,但不实用;
(4).class CMaster; class CDog{ CMaster*pm;}; class CMaster{ CDog*dogs[10];};
正确,这种关系有时也叫“知道”;
B.覆盖和保护成员;
覆盖:派生类定义一个和基类同名的成员。
在派生类中访问这类成员,缺省时是访问派生类中定义的成员。想要通过派生类访问基类定义的同名成员时,要使用作用域符号::。
protected:
可被下列函数访问:
基类的成员,友元函数
派生类的成员函数可以访问当前对象的基类的保护对象;
明日计划:派生类的构造函数;