当前位置: 首页 > news >正文

C++虚表与虚表指针详解

类的虚表

每个包含了虚函数的类都包含一个虚表。 

当一个类(B)继承另一个类(A)时,类B会继承类A的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。

来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,故类A拥有一个虚表。

class A {
public:virtual void vfunc1(){    cout << "A::vfunc1" << endl;}virtual void vfunc2(){    cout << "A::vfunc2" << endl;}void func1();void func2();
private:int m_data1, m_data2;
};

类A的虚表如图1所示。 

 虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚表,所以虚表的元素并不包括普通函数的函数指针。

虚函数指针的赋值发生在编译器的编译阶段,也就是说在代码的编译阶段,虚表就可以构造出来了。

虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。

虚表指针

为了指定对象的虚表,对象内部包含一个虚表的指针,来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,*__vptr,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。

 上面指出,一个继承类的基类如果包含虚函数,那个这个继承类也有拥有自己的虚表,故这个继承类的对象也包含一个虚表指针,用来指向它的虚表。

虚函数表存储位置

首先虚函数表存储在只读数据段(.rodata)、虚函数存储在代码段(.text)、虚表指针的存储的位置与对象存储的位置相同,可能在栈、也可能在堆或数据段等。
扩展:


 

 

http://www.lryc.cn/news/217683.html

相关文章:

  • 12 pinctrl 和 gpio 子系统
  • 【复盘】记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread
  • Java基础之类型(内涵面试题)
  • idea好用插件整理
  • 【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件
  • 研究人员发现34个Windows驱动程序易受完全设备接管攻击
  • 最新 vie-vite框架下 jtopo安装使用
  • 基础课20——智能客服系统的使用维护
  • Aop自定义注解生成日志
  • 虚幻引擎:RPC:远端调用
  • 涉及多种位运算操作混合类题目——通过加转三进制(扩大状态,不变枚举量):CF1033F
  • BIOS开发笔记 - DDR基础
  • 基于SpringBoot+Vue的旅游系统、前后端分离
  • 手动制作Docker容器镜像
  • WPF布局控件之WrapPanel布局
  • 实现自动接听电话
  • 计算机网络之网络层(全)
  • PS学习笔记合集
  • 汇总记录Python常用的基础内置方法
  • 基于Tensorflow卷积神经网络玉米病害识别系统(UI界面)
  • Execution failed for task ‘:keyboard_utils:compileDebugKotlin‘.
  • AC修炼计划(AtCoder Regular Contest 163)
  • 持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10)
  • 【设计模式】第24节:行为型模式之“模板方法模式”
  • 【考研数学】数学“背诵手册”(二)| 线代及概率论部分
  • Android WMS——WindowState介绍(十三)
  • C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
  • window10 mysql8.0 修改端口port不生效
  • 欧盟网络安全威胁:虚假与错误信息