文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | firefox | WPS | 杀毒软件 | Picasa
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形图像 办公软件 媒体动画 精文荟萃 常用软件 网页编程 技术开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发其他语言C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类)
精品推荐
特别推荐
·给你十条学习Ruby语言的理由
·分页管理机制
·Perl 语言的重要价值体现
·经验技巧:分享两条Delphi开发经验
·Java编程思想:面向对象的逻辑思维方法
·Samba系统简介
热点TOP10
·在VC6中创建wxWidgets项目[附图]
·AIX 5L 学习大纲/简易教程(2)(未经许可,请勿COPY)
·DENX U-Boot及Linux使用手册
·Visual C++ ADO数据库编程入门
·飞机躲避小游戏---是男人就撑100秒的制作
·[仿真实验]操作系统的内存管理
·三维粒子系统在AS2中的实现
·Continuation 和高级流程控制
·简单架设Jabber 局域网即时通讯服务器
·[分形]DLA团簇模型的摸拟
·用汇编编写DOS下的内存驻留程序(3)
·Palm OS应用程序设计指南之五
·Palm OS应用程序设计指南之十一
·图象处理中的边缘检测------canny算子
·samba和openldap结合实战
·列表视图控件
·Internet Explorer 编程简述(十一)完美的Inplace Drag & Drop——“超级拖放”
·EZ-USB 68013A开发指南
·AIX 5L 学习大纲/简易教程(1)(未经许可,请勿COPY)
·利用 wordXP 实现自动排班

C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类)

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]


上一次只是给出一个代码http://blog.csdn.net/OpenHero/archive/2006/04/02/648005.ASPx,和运行过程中的内存位置,现在具体的按照步骤分析一下C++中虚拟继承中的情况,

由于C++ stand(C++ 标准委员会) 并没有规定具体实现的办法,各个编译器厂商可能都采用不同的实现方法,

或许在不同的年代使用的方法也不相同,有可能就会得到不同的结果,这里,我采用VC7.1作为调试工具,由潜

入深的一步步分析C++ 虚继承中的内存布局;

这一部分由Empty virtual base calss (空虚基类:空的calss)入手,查看VC7.1中是如何实现虚拟继承的.

下面给出测试的代码:

一,菱形的继承模式

class A
{ };

class B : virtual public A
{
};

class C : virtual public A
{
};

class D : public C, public B
{
};


int _tmain(int argc, _TCHAR* argv[])
{
 A a;
 B b;
 C c;
 D d;

 int *pd   = (int*)&d;
 int *pd_c = (int*)(C*)(&d);
 int *pd_b = (int*)(B*)(&d);
 int *pd_a = (int*)(A*)(&d);

 cout<< sizeof(a) << endl;
 cout<< sizeof(b) << endl;
 cout<< sizeof(c) << endl;
 cout<< sizeof(d) << endl;
 cout<< pd   << endl;
 cout<< pd_c << endl;
 cout<< pd_b << endl;
 cout<< pd_a << endl;

 return 0;
}

 

有人会问,

class A
{ };

A a, 其中的a会有大小嘛?当然,a里面什么都没有,姑且就认为它是空的吧,但是,编译器如何才能记住a,而又

是空?你能想到一种实现的方法嘛?所以,编译器为了记住空的a,在a的内部放入了一个char的标记,作为它的

唯一标识,这样编译器才能认识那个a.  如果你有兴趣,你可以尝试定义A a,b; 然后你看看a和b是否是一

样的?现阶段来说,应该是不一样的,或许以后谁会发明新的实现方式,那个时候或许是一样也有可能了。

现在让我们看看上面程序的输出情况,如下:
1
4
4
8
0012FEAC
0012FEAC
0012FEB0
0012FEB4

这里我先不对上面的输出做出解释,或许你看了这样的输出会有疑惑,是不是和你想象的不一样?带着疑问

继续往下面看。
下面我再给出两段代码,同时给出他们各自的输出,然后再对这些输出做出解释:

二,六边形(菱形一)
class A
{ };

class B : virtual public A
{
};

class C : virtual public A
{
};

class D : /*virtual */public B
{
};

class E : /*virtual */public C
{

};
class F : public E, public D
{
};
int _tmain(int argc, _TCHAR* argv[])
{
 A a;
 B b;
 C c;
 D d;
 E e;
 F f;

 int *pf   = (int*)&f;
 int *pf_e = (int*)(E*)(&f);
 int *pf_d = (int*)(D*)(&f);
 int *pf_c = (int*)(C*)(&f);
 int *pf_b = (int*)(B*)(&f);
 int *pf_a = (int*)(A*)(&f);

 cout<< sizeof(a) << endl;
 cout<< sizeof(b) << endl;
 cout<< sizeof(c) << endl;
 cout<< sizeof(d) << endl;
 cout<< sizeof(f) << endl;
 cout<< pf   << endl;
 cout<< pf_e << endl;
 cout<< pf_d << endl;
 cout<< pf_c << endl;
 cout<< pf_b << endl;
 cout<< pf_a << endl;


[1] [2] 下一页 




上一篇:samba和openldap结合实战

下一篇:由于域安全组嵌套导致SPS访问控制群组和用户配置文件搜索失败

C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类) 相关文章:
·C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类)
C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类) 相关软件:

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:vipcn