文章目录
前言
本文总结学习C++常见继承面试笔试题。
1-什么是菱形继承,菱形继承的问题是什么?
- 菱形继承是一种多继承的特殊情况
- 菱形继承的问题是:会数据冗余和二义性的问题
例如上图1,子类3的对象中,将父类的成员会保存两份,在用子类3对象调用父类成员时,不知道调用的是子类1还是子类2继承下来的父类成员。
2-什么是菱形虚拟继承,如何解决数据冗余和二义性的?
同类问题:
虚拟继承实现
菱形虚拟继承是在菱形继承的基础上,在父类最近的两个子类应用虚拟继承。
例如上图1,子类3的对象模型中,会将父类的成员存在父类的公共区域,子类1、2中各自存有一个虚基表指针,存储了各自距离父类成员存储位置的偏移量。
例如上图1,子类1的对象模型中,会将父类的成员存在父类的公共区域,子类1中存有一个虚基表指针,存储了距离父类成员存储位置的偏移量。
这样,在使用子类1、2、3对象分别调用父类成员时,会统一以同样的方式,先找各自虚基表指针中的偏移量,依次再来计算父类成员的位置,从而找到父类成员。解决了数据冗余和二义性。
3-继承和组合的区别,各自的应用场景?
3.1 继承和组合的区别
- pubilic继承是一种is-a的关系,每个派生类对象都是一个基类对象;组合是一种has-a的关系,假设B类组合了A类,则每个B类对象都有一个A类对象。
- 继承允许根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用,在继承方式中,基类的内部细节对子类可见,继承一定程度上也破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
- 对象组合是类继承之外的另外有一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用。对象的内部细节不可见,组合之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于保持类的封装。
3.1 继承和组合的应用场景?
一般根据不同关系来具体适用。
- 继承:适用于is-a关系,例如人和学生,动物和狗,车和奔驰车
- 组合:适用于has-a关系,例如人和鼻子,动物和爪,车和轮胎
- 综合考虑软件开发中,模块之间关系尽量保持:高内聚,低耦合,所以二者都可用的场景下,尽量用组合。
总结
这里对文章进行总结:
以上就是今天总结的内容,本文包括了C++继承面试笔试题,分享给大家。
真?欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。
欢迎各位大佬批评建议,分享更好的方法!!!???