【VC++】虚函数 内存结构 - 第一篇(单类)

本文探讨了C++虚函数的内存结构,适合有一定C++面向对象基础和内存知识的读者。通过对比分析,揭示了不同编译器对虚函数实现的细节,指出了一些知名博主文章中的错误。文章强调理解底层原理对解决实际问题和提高编程安全性的重要性,并提供了代码示例以解释潜在的访问风险。
摘要由CSDN通过智能技术生成

前言 - 为何写此系列文章?

网上讨论虚函数内存结构的文章很少,好不容易有几位大神写了几篇很精彩的文章,结果里面还有错误:

陈皓大神的《C++ 虚函数表解析》:
https://blog.csdn.net/haoel/article/details/1948051
《C++ 对象的内存布局(上)》:
https://blog.csdn.net/haoel/article/details/3081328
《C++ 对象的内存布局(下)》:
https://blog.csdn.net/haoel/article/details/3081385

在这里插入图片描述
还有位大神的《图说C++对象模型:对象内存布局详解》:
https://www.cnblogs.com/QG-whz/p/4909359.html
同样有错误。

但是,不否认,几位大神的文章写得确实精彩,我看了之后也受益匪浅,再次感谢几位大神的分享精神。
我并不是做C++的技术极客,几位大神的经验和水平肯定也会比我高,所以我写的此系列文章,重在研究探索与实践,难免有错误的地方,恳请大家大力吐槽,并恳求给出具体的解决方法,在此先谢过。会不定期更新,并记录提出修正方案的朋友,以示感谢,以帮助到更多的人。

前言 - 适合什么样的读者?

引用《深度探索C++对象模型》这本书中的话,有两个概念可以解释C++对象模型:
1、语言中直接支持面向对象程序设计的部分。
2、对于各种支持的底层实现机制。

直接支持面向对象程序设计,包括了构造函数、析构函数、多态、虚函数等等,这些内容在很多书籍上都有讨论,也是C++最被人熟知的地方(特性)。而对象模型的底层实现机制却是很少有书籍讨论的。对象模型的底层实现机制并未标准化,不同的编译器有一定的自由来设计对象模型的实现细节。在我看来,对象模型研究的是对象在存储上的空间与时间上的更优,并对C++面向对象技术加以支持,如以虚指针、虚表机制支持多态特性。

文章主要来讨论C++对象在内存中的布局,属于第二个概念的研究范畴。故读者需要有一定的C++面向对象基础、内存相关知识,比如内存对齐,指针操作等。看完之后,对C++虚函数会有一个底层的理解,可以解决工作中的一些实际问题,比如解决一些很迷惑的bug、逆向工程……

【VC++】虚函数 内存结构 - 第一篇(单类)

#include <IOSTREAM>
using namespace std;

class Base
{
   
public:
	int nBase1;
	int nBase2;

	Base(int n1,int n2):nBase1(n1),nBase2(n2)
	{
   
		cout<<"Base::Base("<<n1<<","<<n2<<")"<<endl;
	}

	virtual void F()
	{
   
		cout<<"Base::F()"<<endl;
	}
	virtual void G()
	{
   
		cout<<"Base::G()"<<endl;
	}
};


typedef void(*Fun)(void);	

void TestBase(Base &b)
{
   
	Fun pFun = NULL;

	cout << "类对象地址 / 虚函数表指针的地址:" << (&b) << " / " <<    (int*)(&b)+0 << endl;//虽然两个地址值一样,但前者是类对象的地址,后者是对象里面的首地址。好比字符串的地址,和字符串里第一个字符的地址,是一样的。
	cout << "虚函数表指针值(虚函数表的地址)(十进制):"	<<        *(int*)(&b) <<endl; //就省略+0了(就是首地址偏移0,还是首地址)
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << (int*)*(int*)(&b) <<endl; //显式指针转换,告知是个指针,输出就是十六进制了
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<		    (
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值