【C++】多态类面试题

多态类面试题

  1. 什么是多态?
    答: 不同的对象完成相同的事件(具有相同的函数),产生不同的结果(函数内部实现不同)。
  2. 什么是重载、重写、重定义?
作用域 函数名、参数、返回值的要求 其它的要求
重载 两个函数在同一作用域 函数名、参数相同
重写(覆盖) 两个函数分别在基类和派生类的作用域 函数名、参数、返回值都相同 两个函数必须是虚函数
重定义(隐藏) 两个函数分别在基类和派生类的作用域 函数名相同 基类和派生类的同名函数不构成重写就是重定义
  1. 多态的实现原理?
    答: 通过虚基表实现。

  2. 构造函数可以是虚函数吗?
    答:不可以。因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

  3. 析构函数可以是虚函数吗?
    答:可以。但是在某一种特定的条件下,必须将析构函数定义为虚函数。(见链接)。

  4. 虚函数可不可以定义成static类型的函数?
    答:不可以。虚函数的地址要存到虚表中去,static不用对象就可以调用,那么没有对象,就没有虚表指针,就找不到虚表了。没有虚表就肯定不能实现多态。没有对象,就没有this指针,所以虚函数就是为了实现出多态,定义成static静态函数就找不到虚表,实现不了多态。
    内联函数不能是虚函数 正确

  5. 虚函数可以定义成内联函数吗?
    答:不可以。内联函数没有地址,每次用到内联函数的时候,都是在调用的地方进行了展开,普通函数有地址,调用的时候汇编代码中就call(调用的意思)一下普通函数的地址,但是内联函数是没有地址的, 在调用地方进行了展开。无法把地址放到虚函数表中

  6. 虚函数表是什么阶段生成的,存在在哪?
    答: 虚函数表示在编译阶段就生成了。 一般情况下存在代码段中(常量区中)

  7. 虚函数表(虚表)、虚表指针、虚函数都是存在哪的?
    答: 虚函数(virtual修饰的函数)和普通函数一样都存在代码段中, 虚表指针存在于对象中(指向虚表),虚表经验证是存在于代码段(常量区)中。

  8. 虚函数表(虚表)、虚表指针、虚函数之间的关系?
    答:虚表指针是存在于对象中,虚表指针指向虚表,即虚表指针就是虚表的首地址。虚表是一个函数指针数组,虚表中存放的都是类中的虚函数的地址。实现多态的时候,通过虚表指针,找到虚表,在通过虚表找到虚函数的地址,调用虚函数。

  9. 对象访问普通函数更快还是虚函数更快?
    答: 1. 如果是普通对象,一样快。因为普通对象调用,是普通调用,只与类型有关 ;
    2. 如果是指针对象或者是引用对象,则调用普通函数块,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。

  10. C++菱形继承是什么? 虚继承的原理?
    答: 多继承: 一个子类有两个或以上直接父类时称这个继承关系为多继承。菱形继承是多继承的一种情况。 这个子类的两个或以上的直接父类同时又有相同的直接父类。 这就是菱形继承
    菱形虚拟继承解决的是数据冗余和二义性的原理。虚继承是通过虚基表指针

  11. 什么是抽象类?抽象类的作用?
    答: 抽象类是含有纯虚函数的类。 抽象类的作用是:强制了派生类重写虚函数,另外体现出了接口继承(见链接)https://blog.csdn.net/weixin_43939593/article/details/103687764

你可能感兴趣的:(C++)