继承和多态的相关面试题总结

继承和多态的相关面试题总结_第1张图片

继承&多态/面试题

  • 目录:
    • 一.继承相关面试题
      • 1.什么是菱形继承?菱形继承有什么问题?
      • 2.什么是菱形虚拟继承?如何解决数据冗余和二义性?
      • 3.继承和组合的区别?分别在什么时候应用?
    • 二.多态相关面试题
      • 1.什么是多态?
      • 2.什么是重载 / 重写(覆盖) / 重定义(隐藏) ?
      • 3.多态的实现原理?
      • 4.inline可以是虚函数吗?
      • 5.静态成员可以是虚函数吗?
      • 6.构造函数可以是虚函数吗?
      • 7.析构函数可以是虚函数吗?什么场景下是?
      • 8.对象访问普通函数快还是虚函数快?
      • 9.虚函数表在什么时候生成?存在于哪里?
      • 10.虚继承的原理?
      • 11.什么是抽象类?抽象类的作用?

目录:

一.继承相关面试题

继承的具体理解
继承和多态的相关面试题总结_第2张图片

1.什么是菱形继承?菱形继承有什么问题?

1.就我理解的来说,菱形继承就是有两个派生的子类继承了基类,并且还有一个派生的子类继承了之前派生的两个类,对应的四个类形成的一个类似于菱形的继承步骤就叫做菱形继承.

2.菱形继承会产生数据冗余和数据二义性,因为在第一阶级继承了基类的两个类存有相同的基类数据,如果将其再次继承给一个积累的时候,就会发现同一个数据被多次继承了,这样的话就会造成数据冗余,并且在最后继承两个派生类的子类中,如果需要取数据的话,会不知道从哪一个父类中进行创建对象,且应用其对应的成员函数,故会造成数据二义.

2.什么是菱形虚拟继承?如何解决数据冗余和二义性?

1.菱形虚拟继承就是按照菱形继承的方式,给对应的成员函数加上vritual关键字,让其变为虚拟继承的方式,运用了菱形虚拟继承后,其内部存储的方式会自动生成对应的虚基表,用来存储对应的偏移量,从而达到指向同一个数据的目的,从而解决了数据冗余和数据二义性.

3.继承和组合的区别?分别在什么时候应用?

继承关系 组合关系
优点:子类能自动继承父类所拥有的接口 缺点:整体类不能有和局部类相同的接口
优点:创建子类对象无需创建父类的对象 缺点:在创建整体类的对象时需要创建局部类的对象
缺点:子类不能改变父类的接口,但是可以对其进行覆盖 优点:整体类可以对于局部类进行封装形成新的接口使用
缺点:不支持动态继承,运行时无法选择不同的父类 优点:支持动态组合,在运行时可以选择不同的局部类
缺点:可以进行扩展,但会增加系统的复杂度 优点:扩展性能好
缺点:破坏封装,紧耦合,子类依靠于父类,失去了独立性 不破坏封装,松耦合,彼此之间相互独立

继承适用场景:一般编码规范都要求类的层次结构不要超过3层用继承
组合适用场景:对于比较大型的程序来说,优先使用组合

二.多态相关面试题

多态的具体理解
继承和多态的相关面试题总结_第3张图片

1.什么是多态?

1.多态就是同一操作作用于不同的对象,可以有不同的解释,产生出不同的执行结果,就叫做多态. 就是用基类的引用指向子类的对象
2.可以利用区动物园买到学生票和成人票的不同来理解多态的实现/作用

2.什么是重载 / 重写(覆盖) / 重定义(隐藏) ?

重载: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数
类型不同即可。

重写: 重写就是当基类出现纯虚函数的时候,基类就会变成抽象类,我们如果要使用派生类来继承基类的时候,还要使用基类成员函数的时候,我们就需要在派生的子类中对于基类的纯虚函数进行重写,才可以使用,这种过程就叫做重写

重定义: 子类中含有一个和父类一样的名字的函数,在调用的时候,会优先调用子类中的成员函数,从而如果不声明类的话,无法调用出基类的同名成员函数,只能看到子类的,就叫做重定义.

3.多态的实现原理?

在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。

4.inline可以是虚函数吗?

不能,因为inline函数没有地址,无法把地址放到虚函数表中。

5.静态成员可以是虚函数吗?

不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。

6.构造函数可以是虚函数吗?

不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

7.析构函数可以是虚函数吗?什么场景下是?

1. 可以,并且最好把基类的析构函数定义成虚函数。
2.当一个类被作为基类并且该基类对派生类的对象进行操作,在析构时防止只析构基类而不析构派生类的状况发生。把基类的析构函数设计为虚函数可以在基类的指针指向派生类对象时,用基类的指针删除派生类对象,避免内存泄漏。

8.对象访问普通函数快还是虚函数快?

首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。

9.虚函数表在什么时候生成?存在于哪里?

虚函数表是在编译阶段就生成的,一般情况下存在代码段(常量区)的。

10.虚继承的原理?

虚继承的原理: 其实就是在索要派生的子类的名字之前加上virtual关键字,这样的话就把对应基类中的成员/变量/虚表指针等全部赋予给了派生出的子类.
将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。

11.什么是抽象类?抽象类的作用?

1.抽象类是在其类的内部,有一个含有virtual关键字的成员函数进行了=0的操作,构成了纯虚函数,拥有纯虚函数的类就叫做抽象类.
2.抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系。

总体上是对于继承和多态常见问题的梳理,希望对大家有所帮助.

你可能感兴趣的:(Cpp,自我理解,多态,指针,继承)