11.组合与继承
- Inheritance(继承)
- Composition(复合)
- Delegation(委托)
像字符串类,复数类一把不会和其他类发生关联,但有的类可能需要和其它类发生关联,这就是面向对象的思想。
- Composition(复合) ,表示has-a
注解:
- queue跟deque的关系就是复合关系,这就是has-a关系,表示‘我’里面有另外的东西。
- 联想C的结构(体),C的结构体里面可以有别的结构体,也可以由别的整型,浮点型,字符型对象,这也是has-a的关系。
- 所以,Composition表示一个类里面有其他类的实例(来自网友弹幕观点)。
- 其实queue是个容器,它容纳了另外一个东西:deque类的实例。
补全一点:
注解:
- queue的public区域中6个功能完全利用deque的实例c来实现。
- 类复合的意义在于:A拥有B的实例,A的所有功能都利用B的实例来实现。
- 其实这是标准库中的例子。queue队列:先进先出,deque(double ended queue)队列:两端进出,显然后者功能更加强大。
- 最后一句,deque的pop_front()什么都没做,直接改装成了queue的pop()。
- 说不定queue里面的deque有100个功能,但是只开放了6个功能给queue.或者说queue只使用了deque里面的6个功能。
- 这种改造叫做Adapter(改造,适配)。把已有的类的功能改造成客户所需要的其它类的功能。
- 并不是所有的Composition都长这个样子哦,这只是一个特别的例子。
- Composition(复合)关系下的构造和析构
构造由内而外
Container的构造函数首先调用Component的default构造函数,然后才执行自己。
注解:
- 就像建造大楼一样,先建造里面,再建造外面。
- 红色的Component()表示先调用内部的构造函数(如果不符合自己的要求,则要自己写哦),{...}表示后做自己的事情。
析构由外而内
Container的析构函数首先执行自己,然后才调用Component的析构函数。
注解:
- 就像拆大楼一样,先拆外面,后拆里面。就像剥葱一样,先剥外面的,再剥里面的。
- {...}表示先做自己的事情,先执行自己的析构语句。
- Delegation(委托). Composition by reference(两个类通过引用(指针)复合)
注解:
- 左边仍然有一个右边的类的实例,但是这个“有”有点虚,不是那么扎实。只是有一个指向右边的类实例的指针,也可以说只是存储了另一个类的对象的首地址。这样的关系叫做Delegaion(委托)。
- 在任何一个时间点,我想做事情的时候我就可以调用。
- reference counting表示引用计数。a、b、c的内容都是Hello.
- 内容共享,共享的前提是内容要一样。
- 涉及到共享指针、写时复制、写时拷贝(copy on write)。
- Inheritance(继承),表示is-a
注解:
- C++的继承方式有3种:public,private,protected,但是最重要的情况就是public.
- 继承的特点:人是一种动物,动物是一种生物。香蕉是一种水果。这些都是is-a的关系。
- 数据是可以完整的继承下来的。
- _List_node所创建的实例将拥有三个数据成员,自己的1个加上继承自_List_node_base的两个。这一点并不是继承这个语法最有价值的部分。最有价值的部分是虚函数概念。
注解:
- 子类的对象有父类的成分在里面。
- base class的dtor必须是virtual,否则会出现undefined behavior.
构造有内而外(这样才坚固)
Derived的构造函数首先调用Base的default构造函数,然后才执行自己(...)。
析构有外而内(这样也才坚固)
Derived的构造函数首先执行自己(...),然后才调用Base的析构函数。