面向对象编程
-
对象之间的关系
- 继承
- 组合
- 委托
-
组合关系
- 表达了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是一个抽象类,无法实例化
Geekband C++ Week3 Notes
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Week3 notes A.面向对象编程,面向对象设计 composition,复合表示has-a templat...
- 组合与继承 Composition(复合) 一个类包含另一个类(has-a),可以通过Adapter改造一个类,...
- 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...