Composition (复合) has-a

  • 一个类中包含另一个类对象的数据成员
    • deque已经完成了所有功能, queue只是调用deque中所需要的功能, 来实现queue的特性
    • adapter : 把一个功能已经很强大的类进行改装, 适配成另一个类 (只开放部分接口, 甚至更改命名)
      Object oriented programming (OOP)
      Object oriented programming (OOP)

构造和析构

  • 构造 : 由内到外
  • 析构 : 由外到内
  • 默认情况是下列情况, 红色部分是编译器自行添加, 也可以自定义指定对应的构造和析构函数
    Object oriented programming (OOP)

Delegation (委托) Composition by reference

  • 一个类包含另一个类指针对象的数据成员
    • 两个类对象的生命周期并不同步, 可能先创建指针, 之后才创建对象
    • pointer to implementation (pImpl ; handle / body) : 图中左边的类只是一个接口, 具体的实现调用的都是右边的类函数
    • 右边无论如何改变, 都不会影响左边, 编译防火墙
  • pImpl 可以用来实现reference counting, 多个对象共享一份数据, 但当更改其中一个时需要进行copy on write(COW)
    Object oriented programming (OOP)

Inheritance (继承) is-a

  • 大象是一种动物, 不能说动物是一种大象. 因此是大象继承自动物
  • 子类包含父类的部分成员 (和权限关键字有关)

Object oriented programming (OOP)

构造和析构

  • 构造 : 由内而外
  • 析构 : 由外而内

Object oriented programming (OOP)

virtual functions

  • 数据继承会实实在在分配内存, 函数继承只是继承了调用权, 函数仍然只有一份.
  • non-virtual function : 不希望derived class override
  • virtual function : 希望derived class override
  • pure virtual function : derived class must override

Object oriented programming (OOP)

  • 一个形状的类, 并不能实例化对象, 因为没有一个叫做形状的图形
  • 它可以派生出三角形, 正方形, 长方形等等具体的形状的类, 它们进一步实例化对象
  • 形状基类中用一个objectID函数给每一个之后实例化的对象一个流水ID号 (统一分配的, 并不需要子类重写)
  • 形状基类中用一个error函数输出实例化中可能出现的错误, 基类中实现了一个默认的错误输出, 子类可以根据自身情况改写这个错误输出, 也可以使用默认的
  • 形状基类中使用draw函数来画各个图形, 因为每一个子类画的形状都不一样, 并且基类本身也无法具体实现, 因此是pure virtual function, 要求子类必须override.

Template Method

  • 父类中实现了一般性的大部分功能, 把一些关键功能延缓到子类去override

Object oriented programming (OOP)
Object oriented programming (OOP)

Inheritance + Composition

  • 第一种构造顺序 : Base Component Derived
  • 第二种构造顺序 : Component Base Derived
    Object oriented programming (OOP)

相关文章: