C++继承(2)

第一题 

这个题调用构造函数的顺序以及次数

首先 我们要了解 这个地方是虚拟继承 因此这个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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值