C++ 对象切割(Object slicing )与虚拟函式 [大三TJB_708]_c++ object slicing_资质平庸的程序员的博客-程序员秘密

1 对象切割(Object slicing)

一般来说,衍生类所占的存储空间一般都比基础类大。当用基础类强制转换派生类物件(对象)指標时就会产生对象切割(Object slicing)。

 

2 举例子

class CObject
{
  public:
	virtual void vfunc(){cout << "CObject:vfunc\n";}
};

class CObject1 : public CObject
{
  public:	
	int m_data1;
	void fun()
	{	cout << "CObject1:fun \n";
		vfunc();
	}	
	virtual void vfunc(){
		cout << "CObject1:vfunc \n";
	}
};

class CObject2 : public CObject1
{
  public:
	int m_data2; 
	virtual void vfunc()
	{
		cout << "CObject2:vfunc \n";
	}
};

void main()
{
	CObject2 myobject; 
	CObject2 *mypobject = new CObject2;
	
	//--------------test1---------- 
	myobject.fun();
	
	//--------------test2---------- 
	((CObject1*)(&myobject))->fun();
	
	//--------------test3---------- 
	mypobject->fun();

	//--------------test4---------- 
	((CObject)myobject).fun();
}

 

<pre>
程序运行结果如下:



CObject1:fun
CObject2:vfunc
CObject1:fun
CObject2:vfunc
CObject1:fun
CObject2:vfunc
CObject1:fun
CObject:vfunc
因为只有CObject1类具有fun函数,所以所有的调用都是调用CObject1内的fun函数,根据虚拟函数的妙用( http://blog.csdn.net/misskissc/article/details/8544056)可知,当每个物件(对象)调用函数时都是调用对象所对应类中所定义的函数。根据执行结果,只有最后一个结果略显不同,其实最后一个结果经历了对象切割。
 

3对象切割

其实test4所经历的过程如下

图1.对象切割图示
当我们呼叫
((CObject)myobject).fun();
myobject已经是被切割了。编译器在此语句为传值的方式下把CObject1物件内的内容拷贝了一份,使myobject的vtable内容与CObject1物件的vtable内容一样。所以,程序中的test4调用的虚拟函式为CObject1物件的vtable中的对应的虚拟函式。

此次笔记记录完毕。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/misskissC/article/details/8545565

智能推荐

angular有哪些优缺点?_angular1的优劣势_IT修真院的博客-程序员秘密

这里是修真院前端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析前端知识/技能。大家好,我是IT修真院深圳分院韩鹏,一枚正直纯洁善良的前端程序员。今天给大家分享一下,修真院官网JS任务10,深度思考中的知识点:angular有哪些优缺点?1.背景介绍AngularJS是一款为了克服...

Direct2D入门_Augusdi的博客-程序员秘密

Direct2D入门一. 资源管理(Resource management)和Direct3D一样,Direct2D程序需要处理设备丢失(Device lost)问题。Direct2D中的资源分为设备独立资源(Device independent resource)和设备依赖资源(Device dependent resource)。设备独立资源包括:ID2D1DrawingStateBlockI

hdoj-2896 病毒侵袭(AC自动机)_hdoj 2896_落辰哀的博客-程序员秘密

病毒侵袭Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31585    Accepted Submission(s): 7224Problem Description当太阳的光辉逐渐被月亮遮蔽,世界失去了光

【精】LintCode领扣算法问题答案:201. 线段树的构造_线段树算法题_二当家的白帽子的博客-程序员秘密

201. 线段树的构造描述线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:根节点的 start 和 end 由 build 方法所给出。对于节点 A 的左儿子,有 start=A.start, end=(A.start + A.end) / 2。对于节点 A 的右儿子,有 start=(A.start + A.end) / 2 + 1, end=A.end。如果 start 等于 end, 那么

民机飞控系统cpu、pld选型准则_岂曰无衣gx的博客-程序员秘密

控“可以理解成飞机的CPU系统,是飞机的核心部件,其功能主要是发送各种指令,并且处理各部件传回的数据追求高性能的同时应更关注产品应用的成熟度。

java 环境_andych008的博客-程序员秘密

1. PATH环境变量。作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。2.

随便推点

装完nvme固态经常蓝屏_NVME固态硬盘安装WIN7系统时蓝屏(0x000007B)怎么解决_松脂领花的博客-程序员秘密

] 随着NVMe SSD固态硬盘越来越受大家的关注,使用的人越来越多,特别是8代以后的CPU固态硬盘都采用的NVME协议,那么面临的一个问题就是,WIN7系统中默认是没有NVME驱动的,在安装GHOST WIN7时经常遇到0x0000007b蓝屏,该蓝屏代码为找不到硬盘,在安装原版WIN7的时候也会出现找不到硬盘导致安装不了的问题,那么NVME固态硬盘如何安装WIN7系统呢?今天重点是讲解NVME...

盘点五个干净、简洁、实用的手机浏览器app软件_指尖浏览器类似的浏览器_聚推软件的博客-程序员秘密

一、X浏览器用过的都说X浏览器的广告拦截很强悍大小:0.8M,无开屏页,只有安卓版本。用过 Chrome 的 都说X浏览器是好的备胎。无新闻,无推送,无后台,不足1M却小而强大,给你淋漓尽致的浏览体验。极简干净整洁的界面交互,无新闻,无推送,无后台服务,省流省电。强大的资源嗅探能力,轻松下载保存网络资源,图片,音频,视频。二、Via浏览器追求极简,极客之选大小:0.5M ,无开屏页,2S内开始搜索。只有安卓版本。绝对的干净清爽,简约却不简单,有广告拦截、添加脚本,翻译网页等实在的功能

基于Matlab的Poisson分布,基于matlab的泊松分布的仿真.doc_刘良运的博客-程序员秘密

基于matlab的泊松分布的仿真泊松过程样本轨道的MATLAB仿真一、 Poisson Process定义若有一个随机过程是参数为λ&gt;0的Poisson过程,它满足下列条件:1、= 0;2、对任意的时间指标,增量3、对任意的自然数n≥2和任意的时间指标,n个增量是相互独立的随机变量。二、从泊松过程的定义可知1、泊松过程具有平稳独立增量性。2、时间指标集合为[ 0 , +∞],状态空间为 。3...

0425-ofdm-LS/MMSE信道估计以及MIMO-ZF/MMSE信号检测_中杯冰美式的博客-程序员秘密

ofdm信道估计:根据发送的训练序列,信道正交性假设以及接收到的序列,估计信道,目的是得到H,这里的估计出来并插值之后的H进一步用于后边的信号检测,比如MIMO的信号检测,LS和MMSE是最小化的距离或者标准是什么才这样命名的。自己在学习的时候,只对ls,以及mmse这两个术语有印象,但是信道估计以及信号检测中都有这两种方法,他们的作用我并不是很清楚,因此,这里自己根据《mimo-ofdm》的书籍总结了一下。那么mimo的信号检测的表达式中,只有估计出来的信道矩阵H以及信道上估计出来的噪声方差。

2、SkyWalking部署-Windows环境(SkyWalking Windows环境部署)_skywalking windows部署_清云逸仙的博客-程序员秘密

SkyWalking部署文档-Windows环境 文件状态: [ ] 草稿 [√] 正在修改 当前版本 1.0 历史修订版本 1.0; 作 者 杜有龙 完成日期 2019-01-16 一、环境搭建资料--https://blog.csdn.net/zhangkang65/article/det...

推荐文章

热门文章

相关标签