c++中的继承、组合和代理--GeekBand(第三周)

c++是典型的面向对象语言,所谓的面向对象语言包含着两部分内容:
  • 基于对象:就是关注单个class的设计与构建,比如成员变量和成员函数等等内容
  • 对象之间的关系:关注的是class之间的关系,对象之间的关系可以概括为继承、组合和代理3种

继承、组合和代理之间的区别:比如class A和class B。继承在逻辑上是一种"a kind of"的关系,比如student is a kind of human(学生是人类)。组合在逻辑上是一种" a part of"的关系,c++ primer书中有个经典的例子,Eye(眼睛)、Mouse(嘴巴)是Head(头)的一部分。代理和组合很像,不同在代理可以看成一种间接的组合,是通过指向对象的指针来实现的,用法非常灵活。

什么时候使用继承、组合和代理:就是在解决问题的时候,对象之间的关系该改用哪种方法。平时很强调的继承在使用的时候要非常慎重,不能仅仅通过直观的感觉,A和B之间是继承关系,其实应该从对象中函数功能的角度来考虑,即两个class之间有多大的复用度。因为继承是一种强耦合的关系,与面试对象的要求低耦合相反,实际用的过程要很小心。因为他降低了耦合性。意味着父类的改变会影响到子类代码的修改。组合是在B类中将A类对象作为其成员变量,A类代码的改变一般不影响B的功能,在初始化B类的时候初始化A。代理是在B类中创建一个A类成员对象指针,在A类中的方法中通过这个成员对象去调用它自己的方法,这种包装成员方法来获得一个新方法的技术可以避免继承导致完全暴露父类方法的问题,用法非常灵活。

初始化顺序和析构顺序:类直接的这3中关系,都是类与类的关系。当我们在初始化的时候,他们初始的顺序是个重点关注。在继承关系中,构造顺序是先调用基类的构造函数,然后在调用自己的构造函数,是一种由里而外的方式,而析构的时候恰恰相反,是按照先外面在里的方式,即先调用自己的析构函数在调用父类的析构函数。其他两种顺序不是很明确,依赖于实现的编译器等。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,540评论 1 51
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 2,855评论 0 3
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,176评论 6 13