059day(继承和复合关系,覆盖和保护成员)

来源:互联网 发布:大数据hadoop开发平台 编辑:程序博客网 时间:2024/06/04 00:34

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:

可被下列函数访问:

基类的成员,友元函数

派生类的成员函数可以访问当前对象的基类的保护对象;



明日计划:派生类的构造函数;


原创粉丝点击