11.组合与继承

  • Inheritance(继承)
  • Composition(复合)
  • Delegation(委托)

像字符串类,复数类一把不会和其他类发生关联,但有的类可能需要和其它类发生关联,这就是面向对象的思想。

  • Composition(复合) ,表示has-a

注解:

  1. queue跟deque的关系就是复合关系,这就是has-a关系,表示‘我’里面有另外的东西。
  2. 联想C的结构(体),C的结构体里面可以有别的结构体,也可以由别的整型,浮点型,字符型对象,这也是has-a的关系。
  3. 所以,Composition表示一个类里面有其他类的实例(来自网友弹幕观点)。
  4. 其实queue是个容器,它容纳了另外一个东西:deque类的实例。

补全一点:

 注解:

  1. queue的public区域中6个功能完全利用deque的实例c来实现。
  2. 类复合的意义在于:A拥有B的实例,A的所有功能都利用B的实例来实现。
  3. 其实这是标准库中的例子。queue队列:先进先出,deque(double ended queue)队列:两端进出,显然后者功能更加强大。
  4. 最后一句,deque的pop_front()什么都没做,直接改装成了queue的pop()。
  5. 说不定queue里面的deque有100个功能,但是只开放了6个功能给queue.或者说queue只使用了deque里面的6个功能。
  6. 这种改造叫做Adapter(改造,适配)。把已有的类的功能改造成客户所需要的其它类的功能。
  7. 并不是所有的Composition都长这个样子哦,这只是一个特别的例子。
  • Composition(复合)关系下的构造和析构

构造由内而外

Container的构造函数首先调用Component的default构造函数,然后才执行自己。

 注解:

  1. 就像建造大楼一样,先建造里面,再建造外面。
  2. 红色的Component()表示先调用内部的构造函数(如果不符合自己的要求,则要自己写哦),{...}表示后做自己的事情。

析构由外而内

Container的析构函数首先执行自己,然后才调用Component的析构函数。

注解:

  1. 就像拆大楼一样,先拆外面,后拆里面。就像剥葱一样,先剥外面的,再剥里面的。
  2. {...}表示先做自己的事情,先执行自己的析构语句。
  •  Delegation(委托). Composition by reference(两个类通过引用(指针)复合)

 

 

 

 

注解:

  1. 左边仍然有一个右边的类的实例,但是这个“有”有点虚,不是那么扎实。只是有一个指向右边的类实例的指针,也可以说只是存储了另一个类的对象的首地址。这样的关系叫做Delegaion(委托)。
  2. 在任何一个时间点,我想做事情的时候我就可以调用。
  3. reference counting表示引用计数。a、b、c的内容都是Hello.
  4. 内容共享,共享的前提是内容要一样。
  5. 涉及到共享指针、写时复制、写时拷贝(copy on write)。
  • Inheritance(继承),表示is-a

 

 

注解:

  1. C++的继承方式有3种:public,private,protected,但是最重要的情况就是public.
  2. 继承的特点:人是一种动物,动物是一种生物。香蕉是一种水果。这些都是is-a的关系。
  3. 数据是可以完整的继承下来的。
  4. _List_node所创建的实例将拥有三个数据成员,自己的1个加上继承自_List_node_base的两个。这一点并不是继承这个语法最有价值的部分。最有价值的部分是虚函数概念。

 

注解:

  1. 子类的对象有父类的成分在里面。
  2. base class的dtor必须是virtual,否则会出现undefined behavior.

 构造有内而外(这样才坚固)

Derived的构造函数首先调用Base的default构造函数,然后才执行自己(...)。

 

 析构有外而内(这样也才坚固)

Derived的构造函数首先执行自己(...),然后才调用Base的析构函数。

 

posted on 2020-07-26 09:58  一杯明月  阅读(287)  评论(0编辑  收藏  举报