GeekBand.重学C++(2)

类间关系:组合/委托/继承

Composition 组合(has-a)

  • Container has a Component: Component 类 功能很全面,Container 类根据需要设计对外接口,实现全部在 Component 类中。
Composition
  • 内存:Container 对象的内存中,包含一块 Component 的内存; 由内而外构造,由外而内析构.
GeekBand.重学C++(2)_第1张图片
Composition memory

Delegation 委托(Composition by reference)

  • Handle reference Body:所有实现都在 Body 类中完成;Handle 根据需要设计对外接口,通过调用 Body 的方法实现
Delegation
  • 内存分布:Handle 类有一块内存,存放 Body 类对象的内存地址
GeekBand.重学C++(2)_第2张图片
Delegation memory
  • Delegation 的优点:
    • 信息隐藏
      包含 Handle 类所在的头文件,不仅成员函数实现不可见,类中实际的数据成员也不可见,很好的实现了信息隐藏。
    • 编译防火墙
      修改 Body 类,包含 Handle 类头文件的所有源文件都不需要重新编译,只需要编译 Body 类所在的源文件。在大工程中,可以有效的减少编译时间。
    • Copy on write
      Body 类增加引用计数字段,多个 Handle 类的对象可以引用同一个 Body 对象,某个 Handle 对象需要改变 Body 对象的数据成员时,Copy 一份副本供其修改。如果类 size 很大,可以减少内存使用。

Inheritance 继承(is-a)

  • 内存分布:子类对象的内存中,包含一块父类对象;由内而外构造,由外而内析构
GeekBand.重学C++(2)_第3张图片
Inheritance
GeekBand.重学C++(2)_第4张图片
Inheritance memory
  • 哪些成员可以被继承?哪些不能继承?
    • 数据成员都被继承
    • 友元关系不能继承
    • 非虚成员函数。子类可以覆写(override)
    • 虚函数,子类可以重写
    • 纯虚函数,子类必须实现 (父类可以定义)
  • 价值在于,与虚函数搭配使用,实现多态

Inheritance with virtual

  • Template Method:父类的成员函数实现应用程序框架(处理流程),将子类中不同的步骤定义为虚函数,子类重写。
  • 优点:代码重用,子类只需要实现与父类不同的部分,其他部分可以使用父类的实现。

Inheritance + Composition

  • Observer:解决一份数据多种表现形式问题。
  • Composite:嵌套 has-a 的形式。
  • Prototype:框架已经写好,框架中会创建子类对象,但是未知子类可能很长时间以后才会定义。

你可能感兴趣的:(GeekBand.重学C++(2))