美文网首页
GeekBand.重学C++(2)

GeekBand.重学C++(2)

作者: EthanZhang_ | 来源:发表于2016-03-21 01:38 被阅读0次

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

Composition 组合(has-a)

  • Container has a Component: Component 类 功能很全面,Container 类根据需要设计对外接口,实现全部在 Component 类中。
Composition
  • 内存:Container 对象的内存中,包含一块 Component 的内存; 由内而外构造,由外而内析构.
Composition memory

Delegation 委托(Composition by reference)

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

Inheritance 继承(is-a)

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

Inheritance with virtual

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

Inheritance + Composition

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

相关文章

  • GeekBand.重学C++(2)

    类间关系:组合/委托/继承 Composition 组合(has-a) Container has a Comp...

  • GeekBand.重学C++(5)----STL(2)

    待续

  • GeekBand.重学C++(1)

    0x01. 关于头文件 头文件保护 头文件保护,是为了避免重复包含头文件中的声明和定义,导致重定义错误或者编译器找...

  • GeekBand.重学C++(4)

    关于 this 指针 调用父类的成员 非 const 成员中 const 成员中 动态绑定与静态绑定 绑定时期 动...

  • GeekBand.重学C++(3)

    0x01.类型转换 转换函数返回类型可以不写无参数const 成员函数 构造函数:non-explicit-one...

  • GeekBand.重学C++(5)----STL

    0x00. 模板简介 两种模板:类模板和函数模板 代码重用:允许函数和类以泛型的形式表现和运行,针对各种类型都适用...

  • 01-Cin、Cout、函数重载和默认参数

    《C++文章汇总》[https://www.jianshu.com/p/bbd842438420] 久违了,重学C...

  • C++文章汇总

    久违了,重学C++,上一次学C++还是2009年读大一下学期的时候,轮回,发现C++是挺重要的,就像很多事情一样,...

  • js重学2

    一、计算5000米比赛需要跑的完整圈数 var distance = 400; // 一圈是400米var cou...

  • 02 managing threads

    C++ Concurrency in Action 2nd Edition note主线程由C++运行时启动。2....

网友评论

      本文标题:GeekBand.重学C++(2)

      本文链接:https://www.haomeiwen.com/subject/lodklttx.html