C++内存分析(三)
来源:互联网 发布:淘宝美工要求 编辑:程序博客网 时间:2024/05/18 10:46
授权声明
本文为Binhua Liu原创作品。本文允许复制,修改,传递。转载请注明出处。本文发表于2010年6月16日。
原文链接:http://www.cnblogs.com/Binhua-Liu/archive/2010/06/16/1759019.html
前言
在第二节我们讲到从带虚函数的基类继承的子类,有一个虚函数指针在对象的最前端。但是,如果基类没有虚函数而子类有呢?阅读本节请思考下面的问题:没有虚函数的基类,会有虚函数指针和虚函数表吗?从该类继承的子类,内存中的元素如何布局。
Subject3:从不带虚函数的基类继承的子类
我们把上一节的CBasic类的2个虚函数删除,CFinal从CBasic类继承并增加新的虚函数AVG。类图如下:class
CBasic
{
public
:
CBasic()
{
Array=
new
int
[2];
}
int
i;
int
*Array;
void
HelloWorld()
{
cout<<
"hello world"
<<endl;
}
};
class
CFinal:
public
CBasic
{
public
:
virtual
int
AVG(
int
a,
int
b)
{
return
a+b/2;
}
int
iFinal;
};
创建下面的对象
CBasic *b=
new
CBasic;
CFinal *f =
new
CFinal;
CBasic *b1=(CBasic *) f;
我们还是可以用Watch窗口来观察对象中的元素的布局,但本章节不再详列分析过程。我们直接来看这种情况下对象的内存布局图:
我们发现:观察CBasic类对象b,我们发现它没有虚函数指针;而CFinal类对象f有虚函数指针且位于对象地址的最前端;在CFinal类对象内存中,CBasic对象开始于紧接着虚函数指针后的地址;这意味着,当把CFinal类对象转换为CBasic类型时,对象指针指向的地址必须加上4个字节才能正确地指向CBasic对象。打印f和b1的值,我们发现,果然,b1=f+4。
结论
本章节比较简短,让我们做出结论:
对于从没有虚函数的基类继承的带虚函数的子类:
1)其基类对象没有虚函数指针和虚函数表
2)子类的虚函数指针位于对象内存的最前端,子类中的基类对象开始于紧接虚函数指针后的位置。
3)子类对象转换为基类类型时,需要进行指针调整,对象指针指向的地址加4个字节,跳过虚函数指针的位置;反之,把基类对象转换为子类对象时,指针地址减4.
4)子类对象的成员变量存储在紧接着基类对象结束后的位置。
- C++内存分析(三)
- C/C++内存分析
- Gcc - c 内存分析
- C语言内存分析
- Gcc - c 内存分析
- C语言内存分析
- C 语言内存分析
- C语言内存分析
- JAVA内存泄漏分析(三)
- 内存分析(J2SE专题三)
- 内存泄漏分析三-Handler
- C/C++内存知识(三)
- Objective-C(二):内存分析
- C语言内存管理分析
- C语言内存地址分析
- 07.C语言内存分析
- C语言内存管理分析
- C的变量内存分析
- C++内存分析(二)
- winform 实现打印功能
- vim中文编码问题
- PCI设备的地址空间
- Android RTC 自下而上分析
- C++内存分析(三)
- 青春的本质
- Kettle convert mysql datetime '0000-00-00 000000' to Null
- SQL Server2005中触发器的运用
- C++内存分析(四)
- 计数器 的解释
- Five Patterns to Help You Tame Asynchronous JavaScript
- C++内存分析(五)
- 打开workspace时报错:could not launch the application because the associated workspace is currently in use