Geekband C++ Week3 Notes

  • 面向对象编程

  • 对象之间的关系

    • 继承
    • 组合
    • 委托
  • 组合关系

    • 表达了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(shape_ptr)))
          • 不知道具体类型的话,用typeid()挨个试也是个办法,不过极为丑陋,本质上和dynamic_cast都是基于RTTI来做
          • 在Shape里面提供virtual Shape* clone() const = 0;可以很好的解决这个问题

你可能感兴趣的:(Geekband C++ Week3 Notes)