虚指针和虚函数表 vptr vtable

本文概述了C++中虚函数的实现原理,涉及虚表、虚指针以及动态绑定的过程。重点介绍了多态的两种形式——静态多态(如函数重载和泛型)和动态多态(通过虚函数)。讲解了虚函数如何通过虚表进行动态寻址,以及虚指针在多态中的关键作用。
摘要由CSDN通过智能技术生成

1.虚指针和虚表

虚函数在c++中的实现机制就是用虚表和虚指针,是每个类用了一个虚表,每个类的对象用了一个虚指针。

当一个类有虚函数的时候

这个对象就会多一个指针!

父类有虚函数,子类一定有,

把左边的虚指针指向右边的虚函数

虚指针会指向虚表

虚表里面放指针会指向虚函数

编译器看到调用的动作,在过去在C的时代是把它编译成一个特定的语法,call  xxx,xxx某个地址,你要调用哪个函数,编译器就把它解析出来,跳到那个地方去,然后再return 回来。这是调用到固定的地址,call到固定的地址。这就叫静态绑定,但这并不是面向对象的关键点

现在通过指针来调用虚函数,做动态绑定。动态绑定的逻辑意义是通过一个指针找到vptr,再找到vtable,再找到那个虚函数。

C++看到一个函数调用会有两个考量,是要把它静态绑定还是动态绑定

我们要理解的是,静态绑定是编译成什么样子呢,是call xxx

如果符合某些条件就会产生动态绑定,必须符合三个条件

第一个是通过指针

第二个是指针向上转型

第三个是虚函数

通过虚机制来动态绑定

虚函数的这种用法叫做多态!

一个指针可以表现出多种形态。

动态绑定就是通过虚指针找到虚表再找到虚函数指针来调用

虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为virtual;虚函数的调用关系,this->vptr->ctable->virtual function

2.多态

现在我们简单说一下多态,多态分为静态多态和动态多态,静态多态主要指函数重载和泛型编程,动态多态主要就是指虚函数导致的运行时多态吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃代码的航航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值