免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1542 | 回复: 1
打印 上一主题 下一主题

关于C++虚基类的一个例子,求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-11 01:22 |只看该作者 |倒序浏览
class A{
public:
        int a;
};
class B:virtual public A{
public:
        int b;
};
class C:virtual public A{
public:
        int c;
};
class D:public B, public C{
public:
        int d;
};
int main()
{
        D sam;
        A *pa = &sam;
        B *pb = &sam;
        C *pc = &sam;
        printf("sizeof A %d\n", sizeof(A));
        printf("sizeof B %d\n", sizeof(B));
        printf("sizeof C %d\n", sizeof(C));
        printf("sizeof D %d\n", sizeof(D));
        printf("pa:     %p\n&sam:   %p\n", pa,&sam);
        printf("pb:     %p\n", pb);
        printf("pc:     %p\n", pc);
        printf("*pc:    %p\n", *pc);//?
        printf("*pb:    %p\n", *pb);//?为什么不指向同一个虚基类?
        printf("&sam.a  %p\n", &sam.a);
        printf("&sam.b  %p\n", &sam.b);
        printf("&sam.c  %p\n", &sam.c);
        printf("&sam.d  %p\n", &sam.d);
        return 0;
}
输出结果  sizeof A 4
sizeof B 12
sizeof C 12
sizeof D 24
pa:     0012FF60
&sam:   0012FF4C
pb:     0012FF4C
pc:     0012FF54
*pc:    00404314//?为什么*pc   *pb不指向同一个虚基类?
*pb:    0040431C//?为什么不指向同一个虚基类?
&sam.a  0012FF60
&sam.b  0012FF50
&sam.c  0012FF58
&sam.d  0012FF5C

=====================
我猜的是B和C类的对象都有一个指针指向基类子对象A,既然是虚继承,应该只有一个A。
所以猜*pc 和*pb应该指向同一处(唯一的A类子对象)

问题如上注释,我也不大深刻了解对象模型,求助大家是什么原因?谢谢了
(希望回答的不要是“自己翻翻深度探索C++对象模型”书)

[ 本帖最后由 bert1984 于 2008-11-11 01:24 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-11 08:57 |只看该作者
这个是和编译器相关的,目前的gcc 和VS2005的实现上好像都没有指向虚基类的指针吧,编译器根据偏移就可以计算出虚基类的位置。虚基类A的位置应该是在内存模型中的最后面。差不多就是    | int b | int c | int d | int a |  ..当然中间可能还夹杂了其它数据。具体要看编译器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP