复合关系:
为何不用继承?因为用继承的话,父类的接口仍然可以调用。
所以这里 使用所谓的 组合,所谓的适配器Adapter就是这样实现的:
这样组合起来,底层容器是deque,queue可以调用deque的接口去完成自己的接口,而deque里多于的接口,queue是希望屏蔽掉的。而这个的组合,就使得deque的接口没有暴露在外,而继承则会使得deque的接口可以使用。
复合关系下的构造和析构
委托关系(Delegation)
或者叫 复合 by 引用
与上面提到的 复合 关系 有些类似,不过不同的是,string类里面是另一个类的 指针,指向另一个类。
而复合 关系 里面是 含有另一个类的对象。
复合 关系为什么不叫委托呢?术语问题。。
跟复合不同的是 ,不需要同步 构造。
这里的委托关系,可以在需要使用该类时,再去产生该类指针的对象,和调用其方法。
上面的 pimpl 指的是 point to implemention。指向实现。另外一个名字叫做 Handle and Body.
即 右边的body 可以变动的。不管右边如何变动,都不会影响到客户端。
这样的手法也称之为:编译防火墙。左边永远不用再编译,需要重新编译只是右边的body部分而已。(低耦合)
上图中,左下角的图:引用计数。共享内容。
比如C++的 共享智能指针:my github
要跟其他对象共享,就不能牵一发而动全局。什么意思?
现在a b c三个的内容都是hello,a要改变内容的时候,不能去影响到b和c。
改的时候 给了一份副本来改,称之为copy on right
继承
另外,基类的析构函数需要是 虚函数。不然的话不会有下面 子类析构的 由外而内
小结
复合 是 has-a
继承 是 is-a