• 虚指针和虚函数表 vptr vtable


    1.虚指针和虚表

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

    当一个类有虚函数的时候

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

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

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

    虚指针会指向虚表

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

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

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

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

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

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

    第一个是通过指针

    第二个是指针向上转型

    第三个是虚函数

    通过虚机制来动态绑定

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

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

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

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

    2.多态

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

  • 相关阅读:
    云原生系列 【轻松入门容器基础操作】
    外包干了5天,技术明显退步。。。。。
    【MySQL】视图、函数、存储过程优缺点
    图神经网络
    备战“金九银十”,软件测试功能 / 数据库 /linux/ 接口 / 自动化 / 测试开发面试真题解析
    机器视觉杂
    云原生之DevOps
    Redis --- 位图
    如何通过企业数字化管理降本增效?
    python 获取某个字符指定字符的前面、后面和中间的字符
  • 原文地址:https://blog.csdn.net/weixin_60630451/article/details/126686994