探究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语言员工业绩销售源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C语言数据结构之双链表&循环链表&静态链表详解

    C语言数据结构之双链表&循环链表&静态链表详解

    这篇文章主要为大家详细介绍了C语言数据结构中双链表&循环链表&静态链表的原理与使用,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • C++ 结构体初始化与赋值详解

    C++ 结构体初始化与赋值详解

    本文主要介绍了C++ 结构体初始化与赋值详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++中求组合数的各种方法总结详解

    C++中求组合数的各种方法总结详解

    本篇文章是对C++中的求组合数的各种方法进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • 基于C++实现去除字符串头尾指定字符功能

    基于C++实现去除字符串头尾指定字符功能

    编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格。本文为大家详细介绍了如何利用C++实现这一效果,需要的可以参考一下
    2022-04-04
  • C语言利用cJSON解析JSON格式全过程

    C语言利用cJSON解析JSON格式全过程

    cJSON是用于解析json格式字符串的一套api,非常好用,下面这篇文章主要给大家介绍了关于C语言利用cJSON解析JSON格式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 一文带你了解C语言中的动态内存管理函数

    一文带你了解C语言中的动态内存管理函数

    C语言中内存管理相关的函数主要有realloc、calloc、malloc、free等,这篇文章主要为大家讲解一下这四个函数的具体用法,需要的可以参考一下
    2023-03-03
  • C++重载运算符你真的了解吗

    C++重载运算符你真的了解吗

    这篇文章主要为大家详细介绍了C++重载运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C与汇编混合编程的实现示例

    C与汇编混合编程的实现示例

    本文主要介绍了C与汇编混合编程的实现示例,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • C语言实现酒店预订管理系统

    C语言实现酒店预订管理系统

    这篇文章主要为大家详细介绍了C语言实现酒店预订管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论