免费注册 查看新帖 |

Chinaunix

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

【求助】有关虚基类在其派生类中的位置?及其空派生类的大小? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-24 20:24 |只看该作者 |倒序浏览
比如说:

class A {};

class B : virtual public A {};

class C : virtual public A {};

class D : public B, public C {};

用g++编译

B和C的大小应该4个字节,因为他们里面存放着一个指向A的指针。

而D的大小是8个字节,请问D中不应该只是存放着一个指向A的指针么???

还有就是对于class B,它的结构应该是什么样子的?

谢谢~~

论坛徽章:
0
2 [报告]
发表于 2012-03-24 20:32 |只看该作者
B b, c;

那么b和c这两个对象内的指向虚基类的指针是否指向同一个位置?

我对虚基类不太了解,麻烦各位不吝赐教~~

论坛徽章:
0
3 [报告]
发表于 2012-03-24 20:41 |只看该作者
派生类里面是保存整个虚基类的内容还是一个指针呢?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2012-03-24 22:29 |只看该作者
那么b和c这两个对象内的指向虚基类的指针是否指向同一个位置?
------ 是

而D的大小是8个字节,请问D中不应该只是存放着一个指向A的指针么???
------ 一个对象本身也是需要占用字节的呀,空类占一个字节就够了,但加上指针,就需要字节对齐,也就是32位平台上得8个字节。
BTW: 我觉得没有深入了解的必要,因为这只是实现手段,而非标准。

论坛徽章:
0
5 [报告]
发表于 2012-03-25 15:24 |只看该作者
bruceteen 发表于 2012-03-24 22:29
那么b和c这两个对象内的指向虚基类的指针是否指向同一个位置?
------ 是

非常感谢~我只是最近在学习,对虚基类不太理解,不太清楚派生类中的虚基类部分是如何表示的~~

论坛徽章:
0
6 [报告]
发表于 2012-03-25 15:29 |只看该作者
bruceteen 发表于 2012-03-24 22:29
那么b和c这两个对象内的指向虚基类的指针是否指向同一个位置?
------ 是

抱歉,我还想再请教一下——

是不是派生类对象中不只保存着虚基类的内容,还保存着一个指向虚基类定义的指针?

我在这里不太理解~~

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2012-03-25 16:11 |只看该作者
  1. #include <iostream>
  2. using namespace std;

  3. struct A { int a; };

  4. struct B : virtual A { int b; };

  5. struct C : virtual A { int c; };

  6. struct D : B, C { int d; };

  7. int main()
  8. {
  9.         D d;
  10.         d.a = 1;
  11.         d.b = 2;
  12.         d.c = 3;
  13.         d.d        = 4;
  14.        
  15.         cout << &d << endl;
  16.        
  17.         cout << "------------------------" << endl;
  18.        
  19.         cout << "a: " << &d.a << endl;
  20.         cout << "b: " << &d.b << endl;
  21.         cout << "c: " << &d.c << endl;
  22.         cout << "d: " << &d.d << endl;
  23.        
  24.         cout << "------------------------" << endl;
  25.        
  26.         for( size_t i=0; i<sizeof(D)/sizeof(4); ++i ) // 32bits
  27.         {
  28.                 cout << (((void**)&d)+i) << " : " << ((void**)&d)[i] << endl;
  29.         }
  30. }
复制代码
0x22ff34
-----------------------
a: 0x22ff48
b: 0x22ff38
c: 0x22ff40
d: 0x22ff44
-----------------------
0x22ff34 : 0x4031ec
0x22ff38 : 0x2
0x22ff3c : 0x4031f8
0x22ff40 : 0x3
0x22ff44 : 0x4
0x22ff48 : 0x1

论坛徽章:
0
8 [报告]
发表于 2012-03-25 16:17 |只看该作者
bruceteen 发表于 2012-03-25 16:11
0x22ff34
-----------------------
a: 0x22ff48

0x22ff34 : 0x4031ec
0x22ff38 : 0x2
0x22ff3c : 0x4031f8
0x22ff40 : 0x3
0x22ff44 : 0x4
0x22ff48 : 0x1
呵呵,我想问的就是0x22ff34 : 0x4031ec和0x22ff3c : 0x4031f8,这两个指针存放的是什么?~~谢谢~~

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
9 [报告]
发表于 2012-03-25 16:32 |只看该作者

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
10 [报告]
发表于 2012-03-25 16:49 |只看该作者
bruceteen 发表于 2012-03-24 22:29
那么b和c这两个对象内的指向虚基类的指针是否指向同一个位置?
------ 是



这个怎么关对齐,空类什么事嘛,4(B类)+4(C类)=8字节
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP