第一题
这个题调用构造函数的顺序以及次数
首先 我们要了解 这个地方是虚拟继承 因此这个A只用构造一次 B C也只用构造一次
而且是最A先构造的 D是最后构造的 因为A是B C的基类 B C是D的基类
那么 B和C哪个先构造?
先继承的先构造!
class D :public B, public C
像这个代码 先继承的是B 所以B比C先调用构造函数
因此第一题的答案是
A B C D各构造一次 顺序是A->B->C->D
这个地方是虚拟继承 不会通过B C去调用A的构造 而是单独去调用A的构造
思考:这个地方 B C都不会去调用A构造 那么B C 的:S(sa)(显示调用)可不可以去掉?
答案是:不可以 如果我们单独生成B C类呢?
那么A的A(sa)可不可以去掉呢?
答案是:不可以 因为D里面的A(原理和下图一致)既不在B里面也不在C里面 不能依靠B和C来
第二题
这个题目就设计到切割的问题
这个题目画个图很简单 和指针的习题有点像
都是类型不同
因为Base1先继承 所以 Base1在上面 所以这题选C
3.组合和继承
上图C和E就是组合关系 E中只能访问C中的public成员
组合的耦合度低 继承的耦合度高
我们编程一般 低耦合 高内聚
不希望相互之间影响大 每个模块都应该尽可能独立 一个变化要改 其它不用跟着改 (低耦合)
高内聚则是指模块内部的各个元素都是紧密相关的,共同完成一个明确的功能。一个高内聚的模块应该只负责一项任务(高内聚)
因此 尽量多用 组合 适当使用继承
此外 组合关系更像(has-a)
继承关系更像(is-a)