• C++ 虚函数表


    目录

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


    概述


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

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

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


    特点

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

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

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

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

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

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


    虚表指针

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

    动态绑定

    动态绑定的三个条件

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

    动态绑定的流程

    1. 取出类的虚函数表的地址
    2. 根据虚函数表的地址找到虚函数表
    3. 根据找到的虚函数的地址调用虚函数。
    • 对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数
    • 非虚函数的调用不用经过虚表,故不需要虚表中的指针指向这些函数。
  • 相关阅读:
    dreamweaver家乡主题网页设计 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业
    网络安全(黑客)自学
    聚观早报 | 东方甄选推出独立 App;腾讯《冒险岛 2》即将停服
    项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
    部署zabbix5.4
    安科瑞电池能源管理平台介绍
    dreamweaver网页设计作业制作 学生NBA篮球网页 WEB静态网页作业模板 大学生校园篮球网页代码 dw个人网页作业成品
    Polar bear fishing Privacy Policy
    翁凯C语言之结构体复习
    比特米盒子刷CoreELEC
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/126362661