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]