• C++ 虚函数表


    目录

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


    概述


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

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

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


    特点

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

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

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

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

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

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


    虚表指针

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

    动态绑定

    动态绑定的三个条件

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

    动态绑定的流程

    1. 取出类的虚函数表的地址
    2. 根据虚函数表的地址找到虚函数表
    3. 根据找到的虚函数的地址调用虚函数。
    • 对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数
    • 非虚函数的调用不用经过虚表,故不需要虚表中的指针指向这些函数。
  • 相关阅读:
    部署vuepress项目到githubPage
    ES6 入门教程 13 Symbol 13.1 概述
    curl的用法整理
    Elasticsearch:RAG vs Fine-tunning (大语言模型微调)
    SANSAN每周新鲜事|OPC UA 数据采集,你真的了解吗?
    用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (3)- 定时器
    fastadmin页面a标签跳转到新标签页、自定义固定页面
    python:talib.BBANDS 画股价-布林线图
    在Blazor中使用Chart.js快速创建图表
    LightDM简介
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/126362661