title: 8.6.10 封装拓展
tags:
notebook: 8.0 工作准备
一、基础知识
1. 封装
- 封装:方法 + 属性
- 目的:内聚、隐藏等等
- 访问权限和友元
2. 继承
- 权限: 继承权限 + 属性方法权限
- 多继承(深度:最多2或3)
- 多重继承(菱形继承)、虚继承
3. 继承类
- 继承构造顺序 和 析构顺序
- 虚继承 顺序
4. 重载 overload
- 根据参数类型
5, 覆盖 override
- 虚函数 & 动态多态
- 虚构意义
- 虚函数表
二、 仿函数
- 作用:
- 封装属性
- 判定类型
STL中使用大量反函数
三、 空基类优化
- 类的大小不为0
- 空基类优化技术
- 只发生在一层继承
- 成员为基类时不存在类似优化
四、using 用法
引入命名空间
- using namespace std;
- using std::cout;
- using std::string
别名alias
类型别名
typedef std::vector<int> INT_VEC;
using INT_VEC = std::vector<int>;
函数指针
typedef void(*PFUN)()
using PFUN = void(*)()
引入基类构造
using A::A;
自动调用基类的构造
- 赋值,拷贝构造
更改访问权限
在子类中可以访问的属性,可以更改权限
- using A::a;
- using A::print;
五、深入继承权限
public 继承
- 99.9%的继承都是public继承
非共有继承
- 继承 和 组合
- 继承可以自由转换父子类
- public:is-a 的关系
- protected/private:has-a 的关系
用处:
-
非公有继承可以优化内存
例:STL的vector -
非公有继承可以避免不想要的类型转换。
例:STL的vector继承了内存分配类,当你想要内存分配类的时候不能传vector
重点:
用传递赋值时,子类右值赋给父类会导致部分信息丢失未释放, 需要手动释放。
什么时候需要私有继承
- 纯虚基类(约束子类必须实现相关接口)
- 处理父类成员访问权限
- 空基类优化
封装总结
- 继承往往被过度运用,设计过程中,耦合关系要尽量减少。继承是关系最紧密的。
可以参考: - 如果组合可行,就不考虑继承。
- 如果私有继承ok,就不要使用public继承。
- 如果类之间可以使用多种关系,就使用耦合最弱的一种。
- 避免使用多重继承。