vtable

2024-02-20 13:58
文章标签 vtable

本文主要是介绍vtable,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 虚表。

  每一个有虚函数的类都有这样一个东西。

 它实际上记录了本类中所有虚函数的函数指针,也就是说是个函数指针数组的起始位置。

  比如virtual void TheSecondFun()记录在数组的第二个元素,当一个该类的对象实例调用TheSecondFun时就根据对应关系把第二个函数指针取出来,再去执行该函数,这种行为叫晚绑定,也就是说在运行时才知道调用的函数是什么样子的,而不是在编译阶段就确定的早绑定。
  虚函数的处理:
  通常是由虚函数表(vtable)来实现的。
  虚函数表的结构:它是一个函数指针表,每一个表项都指向一个函数。任何一个包含至少一个虚函数的类都会有这样一张表。需要注意的是vtable只包含虚函数的指针,没有函数体。实现上是一个函数指针的数组。虚函数表既有继承性又有多态性。每个派生类的vtable继承了它各个基类的vtable,如果基类vtable中包含某一项,则其派生类的vtable中也将包含同样的一项,但是两项的值可能不同。如果派生类覆写(override)了该项对应的虚函数,则派生类vtable的该项指向覆写后的虚函数,没有覆写的话,则沿用基类的值。
  每一个类只有唯一的一个vtable,不是每个对象都有一个vtable,恰恰是每个同一个类的对象都有一个指针,这个指针指向该类的vtable(当然,前提是这个类包含虚函数)。那么,每个对象只额外增加了一个指针的大小,一般说来是4字节。
  在类对象的内存布局中,首先是该类的vtable指针,然后才是对象数据。
  在通过对象指针调用一个虚函数时,编译器生成的代码将先获取对象类的vtable指针,然后调用vtable中对应的项。对于通过对象指针调用的情况,在编译期间无法确定指针指向的是基类对象还是派生类对象,或者是哪个派生类的对象。但是在运行期间执行到调用语句时,这一点已经确定,编译后的调用代码能够根据具体对象获取正确的vtable,调用正确的虚函数,从而实现多态性。
  例:
  实现多态:
  class a
  {
  public:
  virtual void fun1();
  vitrual void fun2();
  private:
  int i;
  }
  class b : public a
  {
  public:
  virtual void fun2();
  virtual void fun3();
  private:
  int j;
  }
  则class a 的内存layout为(win32 platform)
  begin of layout of class a
  vtable pointer (pointer to vtable of class a see below) (4 bytes)
  int i (4 bytes)
  end of layout of class a
  vtable of class a
  begin of vtable of class a
  start address of a::fun1 (4 bytes)
  start address of a::fun2 (4 bytes)
  end of vtable of class a
  class b 的内存layout为(win32 platform)
  begin of layout of class b
  vtable pointer (pointer to vtable of class b see below) (4 bytes)
  int i (4 bytes)
  int j (4 bytes)
  end of layout of class b
  vtable of class b
  begin of vtable of class b
  start address of a::fun1 (4 bytes)
  start address of b::fun2 (4 bytes)
  start address of b::func3 (4 bytes)
  end of vtable of class b
  所以才有
  a* p = new b;
  p->fun2() 调 b::fun2()

这篇关于vtable的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728445

相关文章

vTable实现多维表格

介绍         vTable是字节开发的一款能用来渲染表格的库,是用canvas渲染,避免了传统用dom组件表格的一些问题,能很快的渲染出上万格子的表格。         接下来我将使用vTable构建类似下面的多维表格,其中quantity、sales等是指标。 使用 官网地址:Getting_Started——VisActor/VTable tutorial document

C++ 虚函数表 vtable

目录 1.测试代码2.查看虚函数表Widget 虚函数表虚函数表 参考 本篇文章通过小实验来了解了解虚函数表,测试环境 ubuntu16 gcc 5.4.0 1.测试代码 测试代码中定义了两个类,后面将会查看这两个类的虚函数表 #include <iostream>using namespace std;class Object {public:Object(){co

C++编译器检索VTABLE的具体方法不同

以前没太注意过这个问题,只知道C++代码调用某个虚函数时要到虚函数表里去查找,然后执行特定的函数。这两天跟别人调程序时发现,VC和gcc对这个检索操作的实现方法是不一样的: 早期的gcc(2001年5月前?)使用的是一个比较直观的查表方法。gcc中指向成员函数的指针其实是一个结构,类似于最早期的cfront编译器: struct{??? short __delta;??? short __i

什么是虚函数表(vtable)?它是如何在 C++ 中实现的?

什么是虚函数表(vtable)?它是如何在 C++ 中实现的? 虚函数表(vtable)是C++中实现多态性的关键机制之一,它用于解决在继承层次结构中的虚函数调用问题。虚函数表是一个存储在内存中的表格,其中包含了类中所有虚函数的指针,每个类都有自己的虚函数表。当调用虚函数时,编译器通过虚函数表来确定应该调用哪个函数的实现。 虚函数表的实现: 虚函数指针(vptr): 每个对象中都包含一个指向虚

一个undefined reference to ‘vtable for CruciformItem‘的错误

错误原因:项目文件夹目录中有item_cruciform.cpp和item_cruciform.hpp这两个文件,然而项目文件列表里面,却没有这两个文件。 解决方法:在项目列表中添加上这两个文件,就不报错了。

Qt 编译出错“undefined reference to `vtable for MainWindows”

突然就出现这个错误,直接重构或者执行qmake即可

Qt undefined reference to `vtable for xxx‘

一、问题背景 在编译QT代码时,出现 undefined reference to xxx::entered(),通过鼠标双击QtCreator“问题栏”中的该行,则会跳转到发送信号的代码所在行。与上述代码一同出现在“问题栏”的还有 undefined reference to `vtable for xxx’。 二、问题分析 qmake不会处理.cpp文件里的Q_OBJECT,所以,如果在

【Qt】报错error:undefined reference to `vtable for Consumer‘的解决方法

1. 问题原因 在创建完程序后,点击构建,显示编译错误。 错误问题如下: error: undefined reference to `vtable 在编译输出中查看显示如下: error:undefined reference to `vtable for custom' 2. 原因分析 这个错误通常是因为 C++ 的虚函数表(vtable)没有正确构建导致的。可能是以下几个原因

Qt中关于undefined reference to `vtable for classname`的问题

转自:http://blog.csdn.net/qian_f/article/details/8498747 在Qt中自定义了类classname,想要使用Qt自带的信号与槽机制,所以必须要将classname继承于QObject。class classname : public QObject{Q_OBJECTpublic:.......}修改之后保存,就出现了undefin

【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]

博主:_LJaXi Or 東方幻想郷 专栏: uni-app | 小程序开发 开发工具:HBuilderX 这里写目录标题 表格组件USE 表格组件 <template><view class="scroll-table-wrapper"><view class="scroll-table-container"><table class="scroll-table">