虚函数如何实现多态?虚函数底层机制是什么?

一个C++面试中经常遇到的题目
多态的实现主要分为静态多态动态多态静态多态主要是重载(函数重载,运算符重载),在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个 子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写 过后的函数,在父类中声明为加了 virtual 关键字的函数,在子类中重写时候不需要加 virtual 也是虚函数。
虚函数的实现:
1.在有虚函数的类中,当类实例化为对象时,最开始部分是一个虚函数表的指针,这个指针指向一个 虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。
2.当子类继承了父类的时 候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址,即虚表指针指向子类的虚表。
3.使用了虚函数,会增加访问内存开销,降低效率。
下面是一些图例可以增加理解:
https://jacktang816.github.io/post/virtualfunction/

class A {
  public:
    virtual void v_a(){}
    virtual ~A(){}
    int64_t _m_a;
};

int main(){
    A* a = new A();
    return 0;
}

这就是如何通过虚函数表找到虚函数的示意图
这就是如何通过虚函数表找到虚函数的示意图,当派生类重写虚函数是,虚表指针就指向子类的虚表了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值