【C++中多态相关面试题】

1.什么是多态

通俗的说,多态就是多种形态,具体点说就是去完成某个行为,当不同的对象去完成时会产生不同的状态。

实现多态的条件
1.调用函数的对象必须是指针或引用
2.被调用的函数必须是虚函数,且完成了虚函数的重写。

什么是虚函数?
虚函数就是在类的成员函数前面加virtual关键字

什么是虚函数重写?
虚函数重写:派生类中有一个跟基类完全相同的虚函数,我们就称子类的虚函数重写了基类的虚函数。虚函数的重写也叫作虚函数的覆盖。

完全相同是指:函数名、参数、返回值都相同。

虚函数重写有一个例外:协变
重写的虚函数的返回值可以不同,但是必须分别是基类指针和派生类指针或基类引用和派生类引用。

析构函数的重写问题:
基类中析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数,这里他们的函数名不相同,看起来违背了重写的规则,其实不然。这里我们可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名字统一处理成destructor,这也说明基类的析构函数最好写成虚函数。

多态的实现原理?
虚函数表

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

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

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

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

虚函数表是在什么阶段生成的,存在哪里。
虚函数表是在编译阶段生成的,一般情况下存在静态区。

什么是静态绑定与动态绑定?
**静态绑定:**又称为前期绑定,在程序编译期间就确定了程序的行为,也称为静态多态,比如函数重载。

动态绑定:又称为后期绑定,是在程序运行期间,具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态,比如重写。

2.重载、重写、重定义的对比

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值