返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >探究c++虚表实现代码
  • 795
分享到

探究c++虚表实现代码

2024-04-02 19:04:59 795人浏览 薄情痞子
摘要

本文简单探究虚表实现。 如下代码中有一个基类CPerson和子类CStudent:public.并有两个虚函数run和cry。 #include<iOStream>

本文简单探究虚表实现。

如下代码中有一个基类CPerson和子类CStudent:public.并有两个虚函数runcry


#include<iOStream>
using namespace std;
class CPerson {
public:
	virtual	void run() {
		cout << "Person is  runing. \r\n";
	}
	virtual void cry() {
		cout << "Person is  cry. \r\n";
	}
};
class CStudent:public CPerson {
public:
	void run() {
		cout << "Student is  runing. \r\n";
	}
	void cry() {
		cout << "Student is  cry. \r\n";
	}
};
int main() {
	CPerson * pStudent = new CStudent();
	pStudent->run();
	getchar();
	return 0;
}

VScl提供了对应命令行查看类的内存布局。
语法cl /d1 reportSingleClassLayoutXXXX YYYY。其中XXX为类名,YYYY为所在文件全路径。
如本例:
cl /d1 reportSingleClassLayoutCStudent \\Mac\Main.cpp输出如下:

在这里插入图片描述

我们再看下CPerson的输出:

在这里插入图片描述

上面的图可能很抽象,大致的意思一个CStudent的内存区域中的第一个内存区域存放一个4字节指针,指针指向一个另一个内存区域,这个内存区域我们称为虚表。虚表内存结构可以理解为一个数组,数组中的每个元素是一个函数指针。指向函数地址。

示例图:

在这里插入图片描述

空说无凭,我们利用VS内存查看器和汇编器证实猜测。

在这里插入图片描述

上图简单来说就是:
(1) 构造了一个CStudent对象,地址为0x00d88d28
(2) 进入对象的地址,对象内存的第一个4字节区域为0x00f89b78,这个存储的数值为虚表指针位置。
(3) 进入虚表内存地址,发现存储了两个指针 0xf8105f0xf81406.

我们再次跳转到0xf8105f内存地址,此时我们查看汇编级别代码。发现是一个jmp指令跳转到实际CStudent::run函数.

在这里插入图片描述

同理0xf81406如下图所示:

在这里插入图片描述

其他扩展知识:

虚表在编译时已经构造完成,在构造对象时,会根据对象的类型在初始化时赋值虚表地址给对象的vfptr 。我们把这种行为称为动态绑定(Dynamic Binding)

到此这篇关于探究c++虚表实现代码的文章就介绍到这了,更多相关c++虚表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 探究c++虚表实现代码

本文链接: https://lsjlt.com/news/135298.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 探究c++虚表实现代码
    本文简单探究虚表实现。 如下代码中有一个基类CPerson和子类CStudent:public.并有两个虚函数run和cry。 #include<iostream> ...
    99+
    2024-04-02
  • C++深入探究list的模拟实现
    目录迭代器正向迭代器类反向迭代器类push_back尾插函数push_front头插函数insert插入函数erase删除函数pop_front函数pop_back函数构造函数析构函...
    99+
    2024-04-02
  • C++虚函数表深入研究
    目录探索虚函数表结构继承基类重写虚函数多基类继承 虚函数表寻找被覆盖的虚函数总结面向对象的编程语言有3大特性:封装、继承和多态。C++是面向对象的语言(与C语言主要区别),所以C++...
    99+
    2024-04-02
  • C++代码实现双向链表
    本文实例为大家分享了C++实现双向链表的具体代码,供大家参考,具体内容如下 双向链表:两个指针域,一个指向前结点,一个指向后结点 list.h #pragma once #defin...
    99+
    2024-04-02
  • C++虚函数表与多态实例代码分析
    这篇文章主要介绍“C++虚函数表与多态实例代码分析”,在日常操作中,相信很多人在C++虚函数表与多态实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表与多态实例代码分析”的疑惑有所帮助!...
    99+
    2023-07-05
  • 分布式 | Global 表 Left Join 拆分表实现原因探究
    本文关键字:JOIN、原理解析、分库分表 问题 前几天,社区交流群一个小伙伴提出这样一个问题: 小伙伴说:全局表和分片表的左连接能否支持 -- 目前测试 mycat 结果不对。 很显然是想要脱坑的 mycat 用户,急需找个替代品...
    99+
    2017-05-30
    分布式 | Global Left Join 拆分表实现原因探究
  • C++实现双向链表代码分析
    目录前言:一、双向链表优缺点二、C++实现分析(1)节点类(2)链表类分析(3)链表类构造函数(4)isEmpty()判断是否为空(5)size()获取链表长度(6)getNode(...
    99+
    2024-04-02
  • C/C++实现线性单链表的示例代码
    目录线性单链表简介C语言实现代码C++语言实现代码线性单链表简介 使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,线性单链...
    99+
    2024-04-02
  • C/C++实现线性顺序表的示例代码
    目录线性顺序表简介C语言实现代码C++语言实现代码线性顺序表简介 使用顺序存储结构的线性存储结构的表为线性顺序表,线性存储结构是元素逻辑结构一对一,顺序存储结构是元素物理结构连续,线...
    99+
    2024-04-02
  • 思岚Athena移动底盘实测 现场表现一探究竟
    上周,思岚科技发布了通用型机器人平台 —— 雅典娜Athena,对,就是那个女神。她的出现,缓解了机器人平台(底盘)市场“好用的底盘太贵,便宜的底盘不好用"的尴尬处境。一直以来,我们对机器人底盘的刻板印象就是:价格贵、体...
    99+
    2023-06-05
  • C语言深入探究水仙花数与变种水仙花数代码
    目录1.水仙花1.1先看代码1.2大体逻辑2.变种水仙花数2.1先看代码2.2代码剖析1.水仙花 题目: 1.1先看代码 #include <stdio.h> int ...
    99+
    2024-04-02
  • C语言实现烟花表白程序代码
    目录效果图烟花爆炸效果思路代码素材总结效果图 烟花爆炸效果思路 不能直接把烟花图片贴到窗口中,需要把烟花的像素点保存到二维数组中,以相同的半径大小把烟花输出到窗口中爆炸的位置,r...
    99+
    2024-04-02
  • 如何使用C++代码实现双向链表
    这篇文章主要介绍“如何使用C++代码实现双向链表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用C++代码实现双向链表”文章能帮助大家解决问题。双向链表:两个指针域,一个指向前结点,一个指向后...
    99+
    2023-06-30
  • 深入探究Java @MapperScan实现原理
    目录1. 前言2. ImportBeanDefinitionRegistrar3. ConfigurationClassPostProcessor4. MapperScannerRe...
    99+
    2023-01-04
    Java @MapperScan Java @MapperScan原理
  • 实用Go语言技巧:优化代码性能的方法探究
    实用Go语言技巧:优化代码性能的方法探究 Go语言作为一门开发效率高、性能优异的编程语言,越来越受到开发者的青睐。然而,即使是在高效的语言中编写代码,也有一些技巧和方法可以进一步优化代...
    99+
    2024-03-04
    性能 go 优化 go语言
  • C#实现表格数据转实体的示例代码
    目录场景需求开发环境开发工具实现代码实现效果场景 在实际开发过程中,特别是接口对接之类的,对于这种需求是屡见不鲜,现在很多在线平台也都提供了像json转实体、sql转实体等。但是很多...
    99+
    2024-04-02
  • C语言实现动态链表的示例代码
    目录结构体定义已经函数声明函数实现创建一个链表判断链表是否为空获得链表中节点的个数在某个特定的位置插入一个元素获得指定下标的节点的元素删除一个节点链表逆序链表的清空链表的销毁链表的遍...
    99+
    2024-04-02
  • 深入探究 Golang 控制语句:优化代码执行
    控制语句用于控制 golang 程序流,包括条件语句(if-else、switch)、循环(for、while)和跳转语句(goto、break、continue)。为了优化代码执行,使...
    99+
    2024-04-08
    golang 控制语句
  • Python 实现链表实例代码
    Python 实现链表实例代码 前言 算法和数据结构是一个亘古不变的话题,作为一个程序员,掌握常用的数据结构实现是非常非常的有必要的。 实现清单 实现链表,本质上和语言是无关的。但是灵活度却和实现它的语言密...
    99+
    2022-06-04
    实例 链表 代码
  • C++代码调用C#代码的过程怎么实现
    这篇文章主要讲解了“C++代码调用C#代码的过程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++代码调用C#代码的过程怎么实现”吧!首先建立一个C#工程Class Library...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作