• C++ 虚函数表


    目录

    📌为了实现C++的多态,C++使用了一种动态绑定的技术,这个技术的核心是虚函数表。
    每个包含了虚函数的类都包含一个虚表,同一个类的所有对象都使用同一个虚表。


    概述


    对于一个类来说,如果类中存在虚函数,那么该类的大小就会多4个字节,然而这4个字节就是一个指针的大小,这个指针指向虚函数表
    所以,如果对象存在虚函数,那么编译器就会生成一个指向虚函数表的指针,所有的虚函数都存在于这个表中,虚函数表就可以理解为一个数组,每个单元用来存放虚函数的地址

    对于多重继承的派生类来说,它含有多个虚函数指针

    虚函数(Virtual Function)是通过一张虚函数表来实现的。简称为V-Table。 在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其真实反应实际的函数
    这样,在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。


    特点

    • 每一个基类都会有自己的虚函数表,派生类的虚函数表的数量根据继承的基类的数量来定。

    • 派生类的虚函数表的顺序,和继承时的顺序相同

    • 派生类自己的虚函数放在第一个虚函数表的后面,顺序也是和定义时顺序相同。

    • 对于派生类如果要覆盖父类中的虚函数,那么会在虚函数表中代替其位置。

    • 没有虚函数的C++类,是不会有虚函数表的。

    • 虚函数表是在编译的过程中创建


    虚表指针

    • 为了指定对象的虚表,对象内部包含一个虚表的指针,来指向自己所使用的虚表。
    • 为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。
    • 一个继承类的基类如果包含虚函数,那个这个继承类也有拥有自己的虚表**,故这个继承类的对象也包含一个虚表指针,用来指向它的虚表。** ​

    动态绑定

    动态绑定的三个条件

    • 通过指针来调用函数
    • 指针upcast向上转型(继承类向基类的转换称为upcast,关于什么是upcast,可以参考本文的参考资料)
    • 调用的是虚函数

    动态绑定的流程

    1. 取出类的虚函数表的地址
    2. 根据虚函数表的地址找到虚函数表
    3. 根据找到的虚函数的地址调用虚函数。
    • 对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数
    • 非虚函数的调用不用经过虚表,故不需要虚表中的指针指向这些函数。
  • 相关阅读:
    软件设计与体系结构编程题汇总
    物流行业采购协同管理系统:规范采购体系,加快物流行业采购数字化升级
    optee默认安全配置
    Tkinter 转载 (来自C语言中文网)
    以矩阵的形式,对点或线段或多边形绕固定点旋转方法
    选择Amazon DynamoDB
    HTML(23)——垂直对齐方式
    记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
    一对一直播系统源码——如何只需三步搭建
    YOLOv7优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/126362661