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中关系,都是类与类的关系。当我们在初始化的时候,他们初始的顺序是个重点关注。在继承关系中,构造顺序是先调用基类的构造函数,然后在调用自己的构造函数,是一种由里而外的方式,而析构的时候恰恰相反,是按照先外面在里的方式,即先调用自己的析构函数在调用父类的析构函数。其他两种顺序不是很明确,依赖于实现的编译器等。