-
面向对象编程
-
对象之间的关系
- 继承
- 组合
- 委托
-
组合关系
- 表达了has-a的关系
- 组合关系下的构造和析构
- 构造由内向外
- 析构由外向内
-
委托关系
- 由引用构造的组合关系
- 延迟实现类的构造
- pimpl手法
- 实现引用计数
- 进一步实现COW
- 隐藏实现
- 本质上是对RAII进一步强化
- 肯定会带来一些性能损失
- 不使用虚函数的时候也许可以改善ABI兼容性?不太确定
- 代码写起来实在是很脑裂。。尤其是类结构比较复杂的情况下
- 由引用构造的组合关系
-
继承关系
- 表达了is-a的关系
- 继承关系下的构造和析构
- 构造由内而外
- 析构由外而内
- base class的dtor必须为virtual,否则为UB
- 在继承体系中,函数的继承实质上继承的是『函数的调用权』
-
虚函数
- non-virtual函数,不希望派生类override这个函数
- virtual函数,希望派生类override这个函数,但提供了默认实现
- pure virtual函数,要求派生类必须override这个函数,因而不提供默认实现
-
继承和组合联合使用情况下的构造和析构
- 使用了组合关系的派生类
- 派生一个使用了组合关系的父类
-
委托和继承联合使用
- Observer模式
-
与委托相关的设计
- 组成模式(Composite)
- 原型模式(Prototype)
- 和js的原型链模型不知道啥关系,不懂js
- 静态成员不一定必须,看需求吧
- 本周作业的场景适合使用prototype模式
- 本周作业中,后续对Shape*数组进行部分或全部深拷贝的时候,由于Shape是一个抽象类,无法实例化
- 知道每个指针指向实例的具体类型的话,可以强转一下再拷贝,如Shape* t = new Circle(*(dynamic_cast<Circle*>(shape_ptr)))
- 不知道具体类型的话,用typeid()挨个试也是个办法,不过极为丑陋,本质上和dynamic_cast都是基于RTTI来做
- 在Shape里面提供virtual Shape* clone() const = 0;可以很好的解决这个问题
- 本周作业中,后续对Shape*数组进行部分或全部深拷贝的时候,由于Shape是一个抽象类,无法实例化
网友评论