文章目录
- 一、什么是菱形继承?菱形继承的问题是什么?
- 二、什么是菱形虚拟继承?如何解决数据冗余和二义性的?
- 三、继承和组合的区别?什么时候用继承?什么时候用组合?
一、什么是菱形继承?菱形继承的问题是什么?
菱形继承简单来说就是:
两个子类继承同一个父类,而又有子类同时继承这两个子类。
菱形继承的问题是:
数据冗余和二义性,由于最底层的派生类继承了两个基类,同时这两个基类又继承了同一个基类,故而会造成最顶部基类的两次调用,会造成数据冗余及二义性问题。
二、什么是菱形虚拟继承?如何解决数据冗余和二义性的?
菱形虚拟继承是:
虚拟继承可以解决菱形继承的二义性和数据冗余的问题。
菱形虚拟继承是靠:在继承之后,并不会创造出两个基类成员给派生类各自继承,而是在派生类中创建一个虚基表来记录偏移量,大小为从派生类继承的基类成员地址到真正基类成员地址。
三、继承和组合的区别?什么时候用继承?什么时候用组合?
继承和组合的区别是: 其一
public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。
继承和组合的区别是: 其二
继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复 用(black-boxreuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被 封装。
当两个类或多个类之间是is-a的关系的时候 :
用继承
当两个类或多个类之间是has-a的关系的时候:
用组合