| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1518 人关注过本帖
标题:关于虚基类问题
只看楼主 加入收藏
偶成
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2006-3-4
收藏
 问题点数:0 回复次数:20 
关于虚基类问题

class one{
public:
int a;
one(int m){a=m;}

};
class two:virtual public one{
public:
int b;
two(int m,int n):one(m){b=n;}
};
class three:virtual public one{
public:
int c;
three(int m,int n):one(m){c=n;}
};
class four:public two,public three{
public:
int d;
four(int w,int e,int r,int t):two(w,r),three(w,e),one(w){d=t;}
};
若不使用虚基类继承,类four的对象占用的内存是20个字节其中有类one的2份同名成员a,
虚基类在派生类中只有一份数据成员,为什么现在类four的对象所占用的内存却是24字节?
占用的内存不是应该比原来少么?

搜索更多相关主题的帖子: 基类 
2006-05-30 16:50
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
不使用虚基类:
A
/ \
B C
\ /
D
使用虚基类:
A A
\ /
B C
\ /
D
怎么会变少呢?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-30 17:14
偶成
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2006-3-4
收藏
得分:0 

能不能根据我写的代码,告诉我下类four所保留的数据成员都有哪些?


几年前,丢失了求知欲,游荡在游戏世界中. 而今寻找回了求知欲,希望通过自学充实自己.努力中...
2006-05-30 17:27
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏
得分:0 

不使用虚基类:
A
/ \
B C
\ /
D
使用虚基类:
A A
\ /
B C
\ /
D
怎么会变少呢?


好像写反了。。随便看了下。

E-mail/MSN: stylev@
2006-05-30 17:44
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
不记得了,哎~!哪位大哥说下,应该是怎么样的

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-30 18:18
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用偶成在2006-5-30 17:27:00的发言:

能不能根据我写的代码,告诉我下类four所保留的数据成员都有哪些?

都是abacd


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-30 20:32
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
我先前说反了吗?我不记得了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-30 20:48
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
wfpb,你是说反了,使用虚基类那么间隔重复继承下的基类中的数据只会有一份拷贝
A
/ \
B C
\ /
D
这种继承很有名,叫菱形继承,你可以查查资料
lz,为什么多了那么多字节是因为虚拟继承下的类中为了实现虚拟继承加了虚函数表这种东西,所以sizeof计算出来的内存空间包含了虚函数表所占的空间

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-31 09:32
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
哦,我虚拟继承这还没怎么学熟!呵呵,主要现在编的程序还用不上,所以就很少看那东西,看了不用也容易忘~!

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-31 12:15
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏
得分:0 
//注明:
当非虚基类继承情况下
one = >int a; //所以sizeof(one) == 4
two = >int one::a, int b; //所以sizeof(two) == 8
three= >int one::a, int c; //所以sizeof(three) == 8
four = > two + three + 自己的int d; //所以sizeof(four) == 20

当虚基类型继承情况下
one = > int a; //sizeof(one) == 4;
two = > int one::a, int b, vptr(因为虚拟继承4bit) //sizeof(two) == 12
three=> int one::a, int c, vptr(因为虚拟继承4bit) //sizeof(three) == 12
four = > two + three + 自己的int d - one(共享一个基类,两个间接继承的class one被折叠为1个) //sizeof(four) = 24

总结:1,vptr,虚继承中virtual class中都有一个vptr,占4字节,
2,如果four继承two, three,那么你只需要加起two和three与自己的字节,与one无关(不管是不是virtual class)
3,当为虚基类型继承时,最远的类总要把两个最近的类折叠成为1个...(如:既减去一个class one)

E-mail/MSN: stylev@
2006-05-31 13:02
快速回复:关于虚基类问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043069 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved