【VC++】虚函数 内存结构 - 第四篇(多重继承,无虚函数覆盖)

c++类大小(涵盖继承 虚继承 虚函数表) 涉及到c++中求类大小时需要特别注意一下几点 1.为类的非静态成员数据的类型大小之和. 2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针、虚继承、多重继承). 3.为了优化存取效率,进行的边缘调整. 4.  与类中的构造函数,析构函数以及其他的成员函数无关.  5.  私有继承,会去继承之前的私有成员变量么? 会...在内存中仍然分配 阅读详情

【VC++】虚函数 内存结构 - 第四篇(多重继承,无虚函数覆盖)

#include <IOSTREAM>
using namespace std;

class Base1
{
public:
	int nBase1;
	int nBase2;
	
	Base1(int n1,int n2):nBase1(n1),nBase2(n2)
	{
		cout<<"Base1::Base1("<<n1<<","<<n2<<")"<<endl;
	}
	
	virtual void F()
	{
		cout<<"Base1::F()"<<endl;
	}
	virtual void G()
	{
		cout<<"Base1::G()"<<endl;
	}
};

class Base2
{
public:
	int nBase1;
	int nBase2;
	
	Base2(int n1,int n2):nBase1(n1),nBase2(n2)
	{
		cout<<"Base2::Base2("<<n1<<","<<n2<<")"<<endl;
	}
	
	virtual void F()
	{
		cout<<"Base2::F()"<<endl;
	}
	virtual void G()
	{
		cout<<"Base2::G()"<<endl;
	}
};

class Derive:public Base1, public Base2
{
public:
	int nBase1;	//与父类成员变量名一样
	int nDerive2;
	
	Derive(int n1,int n2,int n3,int n4,int n5,int n6):Base1(n1,n2),Base2(n3,n4),nBase1(n5),nDerive2(n6)
	{
		cout<<"Derive::Derive("<<n5<<","<<n6<<")"<<endl;
	}
	
	virtual void F2()
	{
		cout<<"Derive::F2()"<<endl;
	}
	virtual void G2()
	{
		cout<<"Derive::G2()"<<endl;
	}
};

typedef void(*Fun)(void);

void TestBase1(Base1 &b)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&b;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&b) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] <<endl ;	//如果仅有一个虚函数,后面的节点不是NULL???
	//pFun = (Fun)pVtab[0][2];
	//pFun();
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;	//之后的内存是什么???
	
	cout<<endl;
}

void TestBase2(Base2 &b)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&b;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&b) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] <<endl ;	//如果仅有一个虚函数,后面的节点不是NULL???
	//pFun = (Fun)pVtab[0][2];
	//pFun();
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;	//之后的内存是什么???
	
	cout<<endl;
}

void TestDerive(Derive &d)
{
	Fun pFun = NULL;
	int** pVtab = (int**)&d;
	
	cout << "类对象地址 / 虚函数表指针的地址:" << (&d) << " / " << pVtab << endl;
	cout << "虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[0] <<endl;
	cout << "虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[0] <<endl; 
	
	cout << "虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[0][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[0][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[0][0];
	pFun();
	
	cout << "虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[0][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][1] << " 调:";
	pFun = (Fun)pVtab[0][1];
	pFun();
	
	cout << "虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[0][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][2] << " 调:";
	pFun = (Fun)pVtab[0][2];
	pFun();
	
	cout << "虚函数表 — 第 4 个函数地址的地址:"  <<  &pVtab[0][3] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][3] << " 调:";
	pFun = (Fun)pVtab[0][3];
	pFun();

	cout << "虚函数表 — 第 5 个函数地址的地址:"  <<  &pVtab[0][4] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[0][4] << endl;
	
	cout << "类对象 — 第 1 个变量地址:" << &pVtab[1]  << " 值:"<< (int)pVtab[1] <<endl;	
	cout << "类对象 — 第 2 个变量地址:" << &pVtab[2]  << " 值:"<< (int)pVtab[2] <<endl;
	//cout << "类对象 — 第 3 个变量地址:" << &pVtab[3]  << " 值:"<< (int)pVtab[3] <<endl;

	//////////////////////////////////////////////////////////////////////////第 2 个虚函数表
	cout << "第 2 个虚函数表指针的地址:" << &pVtab[3] << endl;
	cout << "第 2 个虚函数表指针值(虚函数表的地址)(十进制):" << (int)pVtab[3] <<endl;
	cout << "第 2 个虚函数表指针值(虚函数表的地址)(十六进制):" << pVtab[3] <<endl; 
	
	cout << "第 2 个虚函数表 — 第 1 个函数地址的地址:"  <<  &pVtab[3][0] << " , ";	//好比一个变量的地址
	cout << "函数地址值:"  << (int*)pVtab[3][0] << " 调:";	//好比一个变量的值(这个值也是个地址)
	pFun = (Fun)pVtab[3][0];
	pFun();
	
	cout << "第 2 个虚函数表 — 第 2 个函数地址的地址:"  <<  &pVtab[3][1] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[3][1] << " 调:";
	pFun = (Fun)pVtab[3][1];
	pFun();
	
	cout << "第 2 个虚函数表 — 第 3 个函数地址的地址:"  <<  &pVtab[3][2] << " , ";
	cout << "函数地址值:"  << (int*)pVtab[3][2] << endl;
	//////////////////////////////////////////////////////////////////////////	

	cout << "类对象 — 第 3 个变量地址:" << &pVtab[4]  << " 值:"<< (int)pVtab[4] <<endl;
	cout << "类对象 — 第 4 个变量地址:" << &pVtab[5]  << " 值:"<< (int)pVtab[5] <<endl;
	cout << "类对象 — 第 5 个变量地址:" << &pVtab[6]  << " 值:"<< (int)pVtab[6] <<endl;
	cout << "类对象 — 第 6 个变量地址:" << &pVtab[7]  << " 值:"<< (int)pVtab[7] <<endl;
	cout << "类对象 — 第 7 个变量地址:" << &pVtab[8]  << " 值:"<< (int)pVtab[8] <<endl;
	
	cout<<endl;
}

void main()
{
	Base1 b1(123,321);
	Base2 b2(456,654);
	Derive d(111,222,333,444,555,666);
	
	TestBase1(b1);
	TestBase2(b2);
	TestDerive(d);
	
	cout<<"d.nBase1: "<<d.nBase1<<endl;
	cout<<"d.Base1::nBase1: "<<d.Base1::nBase1<<endl;
	cout<<"d.Base2::nBase1: "<<d.Base2::nBase1<<endl;
	
	cout<<endl;
}

运行结果:
在这里插入图片描述
两个父类的对象,各种地址和值的比对(红色表示不同的地方):

在这里插入图片描述
父类对象 与 子类对象 比对,b1 比对 d:

在这里插入图片描述
b2 比对 d:

在这里插入图片描述
类图、监视值(可以看到,VS的监视值并不全面,还是以实际打印的为准):

在这里插入图片描述
在内存中的结构是:
在这里插入图片描述
在本文结束前,我也还是来介绍下自己吧。我从03年初学编程,一直到现在都在做软件开发方面的事,做过VC++、VB/Delphi/C++Builder、C#/Asp.Net、Java、Web前后端、数据库、服务器端、客户端、js、lua、Flash AS、cocos2dx/Unity3d……都有接触过,甚至做过很长一段时间的运营、产品策划、美工、客服、线下推广员、公司经理 多职务……技术只是一种工具,用来实现业务需求,所以最大的特长是逻辑思维、挖掘业务需求、强化用户体验、快速的产品实现,最自以为豪的,我做过的很多产品,很稳定,bug极少(当然也出现过没考虑周全的漏洞在所难免但总体上也还算少),有很多独立开发的游戏运营到现在还在稳定的运行。不是技术极客,而是业务需求带动技术的学习研究,所以也不怎么挑语言,编程语言大体上也都是相通的,底层原理也有很多类同的地方。所以缺点从不敢说精通哪一门语言。遇到小工具、小需求的订制实现,我个人最喜欢的还是用VC6,简洁干净,编译出来的东西 体积小,速度快,占CPU内存小。当然实际工作中,还是随项目。欢迎大家和我交流,我的QQ是:七6.肆-陆_柒-4`7_四.
生活中的我,热爱 街舞、飙车、花式游泳、游戏一条命通关……极限运动,我抖音号(一不小心玩出花样)是:1917940952

对于父类对象的b1、b2在内存中的结构,前面文章已有详细的图示,此文就不再画了。

文章没有考虑字节对齐(都用默认的字节对齐),并且是在32位环境下,VC6、VS2017 都测试过。

	cout<<"sizeof(Base1): "<<sizeof(Base1)<<endl;	
	cout<<"sizeof(Base2): "<<sizeof(Base2)<<endl;
	cout<<"sizeof(Derive): "<<sizeof(Derive)<<endl;	
	/*
	打印结果:
				sizeof(Base1): 12
				sizeof(Base2): 12
				sizeof(Derive): 32
	*/

(转载时请注明作者和出处。未经许可,请勿用于商业用途)
原创出处:https://blog.youkuaiyun.com/maoyeahcom/article/details/108873586

excel 大写数字转换小写数字 vb代码 菜鸟一枚,朋友需要在excel中将大写数字转换为阿拉伯数字,由于是文本格式的,我也不会,就研究用了vb来实现。当时想着复制粘贴,结果网上没找到,于是自己胡写了一些,一般情况测试通过。 这是vb源码。 普通excel用户在表格中输入=lwzh(A1)即可,A1是需要转换的单元格。 由于朋友只需要转换最大几仟万的数字,所以最大支持玖仟玖佰玖拾玖万玖仟玖佰玖拾玖。需要更大数字的同志们,自己改一下吧,很简单。 源码为加密,按alt+F11可以查看。 立即下载

相关推荐

webview腾讯x5内核离线安装

离线集成腾讯TBS浏览器服务,彻底解决官方下载限流问题,永久免费

观千剑而后识器,操千曲而后晓声。 7914

用delphi写人民币大写转小写的函数

今天找到一个思路,用分段的方法实现了人民币大写转小写的功能,最大到千亿。

程序员与注册会计师 579

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 317

“笨办法”学Python笔记 Lesson18—24

一、作业内容 笨办法学 Python 习题18-24以及加分题。 二、作业代码: # 习题 18:命名、变量、代码、函数 # 知识点总结: # 一、函数可以给代码片段命名,就跟变量和数字命名一样 # 二、它们可以接受参数,就跟你的脚本接受argv一样。 # 三、通过使用#1和#2,它们可以让你创建微型脚本或者小命令。 # this one is like your script...

qq_18893805的博客 2166

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5612

STM32F103 CAN通信避坑指南:从标准库配置到收发测试的完整流程

本文详细介绍了STM32F103 CAN通信的实现流程,从标准库配置到收发测试,帮助开发者避开常见陷阱。内容涵盖硬件连接、波特率计算、过滤器配置及错误处理等关键环节,提供实用的代码示例和调试技巧,确保CAN通信的稳定性和可靠性。

weixin_30627341的博客 324

python语句int_python中的int函数

int函数用来把其他类型向下转换为整数类型int(3.6) --- 3int(3.2) --- 3int(1/3) --- 0int("1") --- 1int()可以按照指定的进制的整数转换为十进制的整数,如果不指定默认是十进制转换为十进制,第二个参数给0和不给一样,除非你自己指定隐含的进制int("3333") --- 3333 (将十进制的3333转化为十进制的数)int("3333",0...

weixin_39756273的博客 707

C++控制台实现简单的注册登录

C++控制台实现简单的注册登录 #include<iostream> #include<string> #include <vector> #include <conio.h> void Display();//调用display显示switch()界面 void Register();//注册 void Enter();//登录 using nam...

乔路非 2万+

15个常用excel函数公式_可直接套用的22个常用Excel函数

Excel曾经一度出现了严重Bug,主要有两种比较悲催的情况,首先是这种:更加悲催的是这种:言归正传,今天和大家分享一组常用函数公式的使用方法:职场人士必须掌握的12个Excel函数,用心掌握这些函数,工作效率就会有质的提升。建议收藏备用着,有时间多学习操练下。目录:数字处理、判断公式、统计公式、求和公式、查找与引用公式、字符串处理公式、其他常用公式等一、数字处理01.取绝对值=ABS(数字)02...

weixin_40001395的博客 2580

第3章 基于三电平空间矢量的中点电位平衡策略

本文档深入探讨了基于三电平空间矢量的中点电位平衡策略。重点在于NPC型三电平逆变器的中点电位平衡问题,由于三电平结构的特点,使得直流侧两个电解电容器的充放电不均匀导致中点电压不均衡。文章通过对不同矢量作用下电流、电压的变化进行了详细的定量和定性分析,并提出了利用冗余小矢量的合理配置以及引入调制因子来解决中点电位偏移的方法,确保中点电压在一个完整的开关周期内的稳定性,进而提高系统的可靠性。

嵌入式老牛的博客 2184

基于点云数据的统计滤波算法改进

随着三维视觉和点云处理技术的发展,点云数据在机器人、自动驾驶、增强现实等领域得到了广泛应用。而点云数据中常常包含着各种噪声和异常点,这些噪声和异常点会影响后续的数据处理和分析任务。因此,对点云数据进行滤波处理是必不可少的一步。在点云滤波算法中,统计滤波(Statistical Filtering)是一种常见且有效的方法。它通过对点云数据进行统计分析,将噪声和异常点剔除或修复,从而得到更为准确和可靠的点云数据。本文将介绍一种改进的统计滤波算法,并提供相应的源代码实现。

QfcaLinux的博客 292

如何把大写金额变为小写数字_人民币金额(数字)大小写转换在线工具

人民币金额用到的中文大写汉字如下:零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿。人民币常识人民币(缩写为RMB)是我国大陆地区的法定货币,尽管每个人几乎天天都要接触到人民币或者支票,但是人民币大写如何写是困扰很多人的问题。尽管生活中看起来极其熟悉而又简单的东西,但发现其实并不会写。人民币在ISO 4217简称为CNY(China Yuan),常用简写为RMB(Ren Min Bi);...

weixin_39744894的博客 2765

自动分割和测量混凝土钢筋的思路与原理

该文提出了一种基于PCL库的点云处理系统,用于自动测量混凝土结构中钢筋的几何参数。系统采用多阶段处理流程:首先通过RANSAC算法提取地面并旋转对齐;接着使用区域生长算法分割混凝土结构;然后采用RANSAC线检测识别钢筋,按方向分类;最后通过圆柱拟合和坐标差计算获得钢筋间距、直径和高度差等参数。文章详细介绍了各模块的核心算法,包括地面检测、坐标变换、钢筋识别和几何计算等关键步骤,并分析了主要参数的敏感性。系统通过分层处理和坐标变换确保测量精度,为混凝土结构的无损检测提供了自动化解决方案。

weixin_45196569的博客 680

【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)

【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)

maoyeahcom的博客 254

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++继承的内存布局

单一继承 可见以下几个方面: 1)虚函数表在最前面的位置。 2)成员变量根据其继承和声明顺序依次放在后面。 3)在单一的继承中,被overwrite的虚函数在虚函数表中得到了更新。 多重继承 我们可以看到: 1) 每个父类都有自己的虚表。 2) 子类的成员函数被放到了第一个父类的表中。 3) 内存布局中,其父类布局依次按声明顺序排列。 4) 每个父类的虚表中的f()函数都被overw...

Waves___的博客 4323

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++ 对象的内存布局(上)

C++ 对象的内存布局(上) 陈皓http://blog.youkuaiyun.com/haoel  点击这里查看下篇>>>前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非

陈皓专栏 【空谷幽兰,心如皓月】 17万+

VC_VC++类继承内存布局

上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型 (美)简.格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object

优快云-MarkYang 2541

c++继承中的内存布局

 今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object

cesc 1万+

多重继承的内存分配

VC++,掀起你的盖头来 ——谈VC++对象模型 (美)简  格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些。因此,从篇幅和内容

maowenge的专栏 2270

[转载]C++继承与内存分配,虚基类指针vbptr和虚函数指针vfptr

转载:继承 内存分布 原作者:DylanWind class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_deriv...

JMcc_的博客 887

C++ 对象的内存布局(上)

转自陈皓的博客前言在谈论虚函数表里,至少有以下这些内容没有涉及: - 有成员变量的情况。 - 有重复继承的情况。 - 有虚拟继承的情况。 - 有钻石型虚拟继承的情况。所以,这篇文章将会是《C++虚函数表解析》的一个续篇,也是一篇高级进阶的文章。对象的影响因素简而言之,我们一个类可能会有如下的影响因素: 成员变量 虚函数(产生虚函数表) 单一继承(只继承于一个类) 多重继承(继承多个类) 重复

yapian8的专栏 725

c++继承中的内存布局 .

今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型 (美)简.格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Objec

求索 696

Windows软件开发实践:C++虚函数与虚函数表

摘要:本文深入探讨了C++虚函数表(vtbl)的实现机制及其在继承中的特性。虚函数表是存储虚函数地址的指针数组,位于类对象内存起始处,所有对象共享同一虚表。文章通过代码实例验证了虚表的存在和访问方式,并分析了5种继承场景下的虚表布局:(1)基类、(2)单继承无覆盖、(3)单继承有覆盖、(4)多重继承无覆盖、(5)多重继承有覆盖。实验表明,派生类会继承基类虚表,重写虚函数会替换对应表项,多重继承会产生多个虚表。研究揭示了C++多态性的底层实现原理。

fairyfar的专栏 584
上一篇: 【 C/C++】变量在内存里的存储区域
下一篇: 【VC++】虚函数 内存结构 - 第五篇(多重继承,有虚函数覆盖)
maoyeahcom
博客等级 码龄15年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值