C++类继承-20170418

1.复习

做项目,尤其是大的项目时,要注意将显示和控制(管理)分开,显示和控制对应到类是 数据类、逻辑类和显示类,
C++类继承-20170418
显示(UI)只调管理类,管理只调数据类,还可直接回调:view函数指针调模型函数。
使用引用计数时,因为多个类占用同一内存,当其中一个改变内存中内容时,所有类的内容都会改变,因此这是可以使用写时拷贝函数。
多个类中相同性质成员组合一个新的类,并作为原类的成员时,构造函数调用顺序是,先“朋友”,后“自己”。

2.继承

(1)定义: 继承是一个类(子类或派生类)继承了另一个类(父类或基类)的所有成员,只需申明继承关系,即继承的方式(公有继承、保护继承、私有继承,公有继承用的最多),便可直接使用到父类中相应成员。
C++类继承-20170418
使用时如下说明:class Cteacher : public /或是protected 和private/ Cperson ,当中间调用方式不写时,默认是保护继承。
(2)父类中私有、保护、公有成员在各继承方式下到子类中使用情况:
(a)父类中私有成员在所有继承方式下都不能给子类使用;
(b)父类中保护成员和公有成员在私有继承方式下变成子类私有成员;
©父类中保护成员和公有成员在保护继承方式下变成子类保护成员;
(d)父类中保护成员和公有成员在公有继承方式下分别变成子类保护成员和公有成员;
(e)私有、保护、公有“要求”越来越松,当父类中松的类成员和紧的继承方式结合时,变成子类中的紧的成员,当父类中紧的类成员和松的继承方式结合时,也变成子类中的紧的成员,即服从就紧不就送原则。
C++类继承-20170418
私有成员是只能在本类中使用,保护成员在本类中使用同私有成员,但可以继承给子类成员,公有成员在本类外可使用,并且可继承给子类。

(3)子类继承父类时,父类中成员在子类中存放位置,子父类有同名时情形:
不管以什么方式继承,父类中的成员变量都会出现在子类的内存中,并且是放在最先的位置,因为在子类中父类的成员变量时不能变的,后边变的往后添加或删除,这样编译器就减少了很多偏移量的计算。
在watch窗口和内存中可对变量的值直接进行更改。
当子父类有同名时情形时,相当于数据隐藏,数据隐藏两个条件:(a)不同作用域;(b)数据成员名相同(参数不同也行)。
父类作用域和子类作用域不同,在类域作用下编译器会由内往外进行查找,直到找到为止,找不到或找到两个同级别的就会报错。同名函数时也是如上,不过找到名字同,参数不同的函数时,就不会往外查找,直接报错。
当要调用父类同名函数和同名变量时,直接加上父类域即可。

(4)继承中的指针转换、构造函数调用顺序
派生类指针 基类指针:如Cteacher* pTea = new CTeacher; CPerson* pPer = (CPerson*)pTea ;这种转换很安全,因为父类字节肯定比子类的要小,使用转换后的指针时,不会有数据出错,而且这种转换在多态中用的比较多。
基类指针 派生类指针:如CPerson* pPer = new CPerson; Cteacher* pTea = (Cteacher*)pPer; 这样可能会导致越界访问,因此此类转换不安全,除非是已知子父类字节相同,即两种指针指向的内容范围一样大时,才会放心使用此类转换。
类似于类组合,在定义子类对象,调用构造函数时会先调父类的构造函数,再调子类的构造函数,有“朋友”(组合类时),先调父类的构造函数,再调“朋友”的构造函数,最后是子类的构造函数。父类的初始化交给父类自身。各自干好自己的事,降低耦合性。