类与类之间三种主要关系
GeekBand 侯捷
1、Conposition(复合)has -a
典例:
复合的部分特点:
1、前者A拥有后者B,A中的所有功能都有B来做。
2、一般B的功能更加强大,一些功能“改头换面”用来实现A的功能。
3、A与B紧密相连,生存期相同。
Composition(复合)语法:
Composition(复合)的图形表现方式
黑色表示有东西,前者是容器,它容纳了后者。
Composition(复合)的内存方式
直观的理解如下:
上图中,在创建dequee类型的c时,系统分配的空间为40。
Composition(复合)关系下的构造和析构
需要说明的是,外部构造函数先调用内部构造函数,完后,再执行外部构造函数自己的剩余部分。
而外部析构函数先析构自己的独有的部分,完后,再执行内部析构函数。
2、Delegation(委托),Composition by reference(指针相连)
典例:
Delegation(委托)的部分特点:
1、A可以在任何有需要的时候调用B,把任务委托给B来做。
2、前者A拥有后者B,A中的所有功能都有B来做。
3、两者通过指针联系,这种联系较弱。
4、A与B使用指针相连,二者的生存期不一致。
Delegation(委托)的语法:
Delegation(委托)的图形表现形式
空心表示使用的是指针,String拥有StringRep
引申形式:
上图中,三个对象共享一个Hello,n用作记录对象个数。
如果a想改动Hello,系统会copy一个Hello出来供A来修改,但b,c不变,这一过程叫“copy on write”。
补充:
1.委托的方式非常实用,特有名称为Handle/Body(pImpI)
2.指针可以指向不同的实现类,这具有一定弹性,B无论怎样变动都不会影响A,这一手法又称“编译防火墙”,A不用再编译,只需编译B。
Inheritance(继承)is-a
典例:
Inheritance(继承)的特点:
1、继承有三种方式,即public/private/protected
2、Public继承中,子类对象含有父类成分。
Inheritance(继承)语法之一(public):
Inheritance(继承)的图形表现方式:
图中,_List_node为_List_node_base的子类
Inheritance(继承)的存储方式:
说明:子类的对象里面有父类的成分。
Inheritance(继承)关系下的构造和析构
补充:
1、继承在和虚函数的结合上大放光彩;
2、base class 的dtor必须是virtual,否则会出现undefined behavior——也就是析构由外到内的好行为。只要class现在或将来可能成为父类,就要把class设为virtual.