探究c++虚表实现代码

 更新时间:2021年09月10日 10:35:37   作者:不会写代码的丝丽  
虚表是一种利用程序语言实现的dynamic dispatch机制,或者说runtime method binding机制,也就是我们说的多态。本文简单探究虚表实现方法,一起看看吧

本文简单探究虚表实现。

如下代码中有一个基类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++虚表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 标准模板类详解

    C++ 标准模板类详解

    今天小编就为大家分享一篇关于C++标准模板类的介绍与使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-09-09
  • 如何利用C语言实现最简单的HTTP服务器详解

    如何利用C语言实现最简单的HTTP服务器详解

    这篇文章主要给大家介绍了关于如何利用C语言实现最简单的HTTP服务器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • QT5 Thread线程的具体实现

    QT5 Thread线程的具体实现

    本文主要介绍了QT5 Thread线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • c++结合opencv如何实现读取多张图片并显示

    c++结合opencv如何实现读取多张图片并显示

    这篇文章主要介绍了c++结合opencv如何实现读取多张图片并显示问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++深入浅出讲解隐藏this指针的用法

    C++深入浅出讲解隐藏this指针的用法

    在C++中,每一个对象都能通过this指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象
    2022-05-05
  • 如何解决C++未定义标识符 “string“、未定义标识符 “cout“、“name”:未知重写说明符错误

    如何解决C++未定义标识符 “string“、未定义标识符 “cout“、“name”:未知重写说明

    在C++编程中,未定义标识符"string"、"cout"错误多因缺少头文件引入造成,而"name":未知重写说明符错误则是未正确重写基类成员函数,解决未定义标识符错误需正确引入<string>和<iostream>头文件,对于未知重写说明符错误
    2024-09-09
  • C++实现简单学生管理系统

    C++实现简单学生管理系统

    这篇文章主要为大家详细介绍了C++实现简单学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++中赋值运算符与逗号运算符的用法详解

    C++中赋值运算符与逗号运算符的用法详解

    这篇文章主要介绍了C++中赋值运算符与逗号运算符的用法详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • MFC实现学生选课系统

    MFC实现学生选课系统

    这篇文章主要为大家详细介绍了MFC实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C++实现寝室卫生管理系统

    C++实现寝室卫生管理系统

    这篇文章主要为大家详细介绍了C++实现寝室卫生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论