关于多态的常见面试题

  1. 什么是多态?
    答:多态就是多个对象完成同一行为所表现出的不同形态。C++多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上。

  2. 什么是重载、重写(覆盖)、重定义(隐藏)?
    答:(1)重载是针对函数来说的,只要函数名相同,参数列表不相同即可构成重载;
    (2)重写/覆盖是针对继承来说的,需要函数名、参数列表、返回值类型均相同,且为虚函数或纯虚函数即可抽成重写(协变除外)。重写是覆盖原来的函数,被重写的函数已经不存在;
    (3)隐藏/重定义是针对继承来说的,只要函数名相同(参数列表可以不一致),不能是虚函数即可构成隐藏。被隐藏的函数依然存在,只是看不见。

  3. 多态的实现原理?
    答:多态的实现是调用虚函数

  4. 哪些函数不能是虚函数,并说明理由?
    答:(1)inline函数,因为inline函数没有地址,无法把地址放到虚函数表中。
    (2)静态成员函数,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚表,所以静态成员函数无法放进虚函数表。
    (3)构造函数,,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

  5. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?
    答:可以,并且最好把基类的析构函数定义成虚函数。

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

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

  8. C++菱形继承的问题,虚继承的原理?
    答:菱形继承就是某个类继承的两个父类来自同一个父类,因此在访问该类对象时会出现冗余性和二义性,为了解决这个问题可采用虚继承。
    虚继承就是含有一个虚基类指针(vbptr),指向自己的基类,作用是描述自己的父类。当发现被继承的另一个父类中也有这么一个相同的虚基类时,两个基类会合并,只保留一个。

  9. 什么是抽象类?抽象类的作用?
    答:包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象。
    将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。对应暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系。

  10. 虚函数的作用?
    答:(1)虚函数用于多态实现;
    (2)虚函数在设计上具有封装和抽象的作用

  11. 纯虚函数是如何定义的,为什么对于存在虚函数的类中析构函数要定义成虚函数?
    答:虚函数的定义:虚函数 = 0;
    为了实现多态进行动态绑定,将派生类对象指针绑定到基类指针上,对象销毁时,如果析构函数没有定义为虚函数,则会调用基类的析构函数,显然,只能销毁部分数据。如果调用对象的析构函数,就需要将对象的析构函数定义为虚函数,销毁时通过虚函数表找到对应的析构函数。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值