文章目录
- 一、横向关系
- 复合(组合)
- 委托(聚合)
- 依赖
- 关联
- 二、纵向关系(继承)
- 继承下构造析构执行的顺序
- 继承方法
- 继承中的作用域
- 多重继承
- 总结
一、横向关系
复合(组合)
- 包含与被包含
- 黑色菱形框代表着拥有
- 黑色菱形端就是容器,它拥有了另外一个东西
- 这种设计模式就是Adapter,改造
- 通常在组合类中包含被组合类对象来实现组合关系
- 往往具有相同的生命周期
委托(聚合)
7. 两个类是指针相连的,生命不同步
8. 左边只是对外接口,实现在右边做。当左边需要动作都要用到右边的类的函数来服务
9. 左边将来也可以指向不同的实现类,右边变动不影响左边,也就不影响客户端。(又称编译防火墙)
10. 通常在聚合类中定义被聚合对象指针的数组、链表等容器。
依赖
- 是一种"uses a"的关系。
- 一个对象的某种行为依赖于另一个类对象,被依赖的对象视为完成某个功能的工具,并不持有对他的引用,只有在完成某个功能的时候才会用到,而且是必不可少的。
- 通常将被依赖的对象作为另一类方法的参数的形式实现两个类之间的依赖关系
关联
- 是一种"has a"的关系。关联不是从属关系,而是平等关系,可以拥有对方,但不可占有对方。
- 完成某个功能与被关联的对象有关,但是可有可无。
- 被关联的对象与关联的对象无生命周期约束关系,被关联对象的生命周期由谁创建就由谁来维护。
- 只要二者同意,可以随时解除关系或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
- 通常在关联的类中定义被关联类对象的指针形式实现两个类之间的关联关系。
注意:依赖关系和关联关系没有生命周期,复合关系和聚合关系是有生命周期的。
二、纵向关系(继承)
让某个对象获得另一个对象的属性和方法就是继承。
被继承的类叫做基类(父类),继承的类叫派生类(子类),在派生类类名后面加:继承方式 基类。
通过继承关系,子类可以使用父类的成员。如果子类和父类有同名的成员,默认使用子类的成员,如果想要使用父类的成员,需要在成员名前加上类名::用于显式的指定区分。
继承下构造析构执行的顺序
当派生类对象被创建时,首先会调用基类的构造函数,然后调用派生类自己的构造函数。
构造函数的调用顺序是按照继承的顺序,从基类依次往下调用。即先调用最上层的基类,再依次往下调用。
析构函数的调用顺序与构造函数的调用顺序相反,先调用派生类自己的析构函数,再依次回溯调用基类的析构函数,直至最上层的基类的析构函数被调用。
继承方法
实现继承
使用基类的属性和方法而无需额外编码能力
接口继承
仅使用属性和方法名称,子类必须提供实现能力
可视继承
子窗体(类)使用基窗体(类)的外观和实现代码的能力
继承中的作用域
① 在继承体系中基类和派生类都有独立的作用域。
② 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
③ 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
④ 注意在实际中在继承体系里面最好不要定义同名的成员。
多重继承
一个派生类有多个基类就叫做多重继承
可通过虚继承解决菱形继承问题(多次继承)
注意:防止继承可使用final关键字
总结
这就是我大概的理解,关于类之间的关系中横向关系跟23种设计模式有很大的联系,而纵向关系更是C++面向对象的三大特征之一。