• C++ 虚函数表


    目录

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


    概述


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

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

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


    特点

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

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

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

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

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

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


    虚表指针

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

    动态绑定

    动态绑定的三个条件

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

    动态绑定的流程

    1. 取出类的虚函数表的地址
    2. 根据虚函数表的地址找到虚函数表
    3. 根据找到的虚函数的地址调用虚函数。
    • 对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数
    • 非虚函数的调用不用经过虚表,故不需要虚表中的指针指向这些函数。
  • 相关阅读:
    Oracle 与 MySQL 的区别总结
    python-opencv 之开运算、闭运算、形态学梯度、“礼帽”和“黑帽”
    K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理
    如何做好外贸独立站
    C++基础(二)
    linux可视化运维工具
    [c++]opencv 鼠标响应函数传入外部参数(图像)问题
    java计算机毕业设计高校宿舍管理系统演示视频2021源码+mysql数据库+系统+lw文档+部署
    C语言oj题
    Java反射用例:
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/126362661