代号3 发表于 2018-4-25 17:00:42

c到c++的过度 第三天笔记

本帖最后由 代号3 于 2018-5-1 06:41 编辑



派生与继承
单继承
多继承
继承方式(公 私 保)
析构构造调用

继承
        类比生物学遗传
       
        程序中,提供了将系统的组成部分组织成一个继承结构的方法,以利于对系统的描述
               
                提供了代码重用的结构                                                                ?引用//不能引用类
                                添加新功能
                用于设计复杂系统
               
        类B继承了类A
                B为A的派生类(子类) 类A 父类 基类
               
                类B拥有类A的全部属性 可拥有新类的属性(属性:成员变量 成员函数)
       
       
        单继承                        一对一 一对多
                派生类只有一个直接基类
               
        多继承                        多对一                                                                ?病毒的变异//病毒机制 可以通过继承
                派生类有多个直接基类的继承方式

               
语法
                class 子类名:public 基类名,~~~(public 基类名)
               
        子类内存=新增成员大小+基类大小;
       
继承方式
        默认私有继承
        公有
                保持访问方式不变 (公公 私私) 子类无法访问基类的私有成员
                                                                                (私有只允许类内访问 保护对子类公开)
                成员可以访问 对象不可以访问私 保
       
        私有
                公私 私私基类公有的也不可以被子类访问
                私私对子类的子类依然有效
                对象不可访问
               
        保护
                公保 保保   保护对子类公开
                公保 保保 依然对子类的子类有效
                对象不可以访问
       
        访问声明        重新定义访问符号控制符
               
语法         父类名::子类名                                                                               
               
        继承之后对子类的影响
                子类对象大小
                        自身+基类
                访问权限
                        继承方式不同 访问权限不同
                        父类中的私有成员都不可被子类访问
                       
                        public 父类在子类中不变
                        protected公保 保保 可被访问
                        private                皆私有 都不可访问
                       
                        访问声明可修改父类成员在子类中的访问控制权限
                       
派生类的构造 析构调用顺序
       
        原则
                无条件先调用父类构造函数 再调用子类
                析构先析构子类 再析构基类
                名字重定义影响 就近原则调用赋值                                                   ?0x//直接写内存
                                        同名时 通过作用域选择符
                        类外默认调用子类函数 调用父类加作用域
                       
                       
重定义
        子类需要修改或扩展基类中某个成员功能时需要用的机制
        重定义后的成员会覆盖基类成员
       
        时机:
                数据成员与基类重名
                成员函数与父类重名(无论参数是否相同 都会重定义)
               
单继承作用
                代码重用
                扩展旧类新功能
                完成封装(复杂类)

多继承
        多对一
       
        语法
                子类:继承类型 父类名,继承类型 父类名,~~~
               
                按照继承顺序调用 析构反序                                 ?父类中有子类有父类//覆盖不是修改 仍然保存
               
                重定义 同单继承
               
                同名
               
                        父类中有同名时编译器出现二义性错误
                                                加作用域解决
                       
                        父类同基类 出现菱形继承 内存重复问题(内存浪费)
                                        只保留一份父类即可
                                引入虚基类
                                        前加virtualeg:class 子类名:vertual pabulic 父类名
                                        产生虚基表   
补充
        虚基类
                目的:用于有共同基类的场合
                语法:
                        virtual <继承方式><基类名>
                        eg:virtual public CClassA            
                               
多继承作用
                将两个功能不相同的类组合成新功能
               
               
使用继承时机
        继承与组合
               
                组合:
                        两个类中满足:
                       A类是B类的一部分;
                class        CB
                {
                        CA m_obj;
                }
                       
                继承:A类是B类中的一种;有特征的子类;

调试技巧               
        不中止 重试 中断
                       
                       
                       
                       
                       
页: [1]
查看完整版本: c到c++的过度 第三天笔记