| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1510 人关注过本帖
标题:关于虚基类问题
只看楼主 加入收藏
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
恩,说得很清楚了,只是虚表没怎么看

[此贴子已经被作者于2006-5-31 13:07:42编辑过]



[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-31 13:07
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 
楼上的兄弟们说的不够准确。
首先,每个类中都没有虚拟函数,所以不会在对象创建时创建虚表,那就更不会有什么指向虚表的指针了。

非虚拟继承比较简单,就不说了。

对于虚拟继承的情况具体分析如下:
首先,two和three两具类由于是虚拟继承了one,即设计者试图共享同一份one的对象,从而减少空间负担。这样,编译器就会在这两个对象中要各引入一个指针(_ptr1和_ptr2),指针指向one的类对象。four继承了two和three两个类,因此其four对象内存布局应该是one对象数据成员+tow数据成员+_ptr1+three数据成员+_ptr2+four数据成员,那么其大小应该是sizeof(int)+(sizeof(_ptr1)+sizeof(int))+(sizeof(_ptr2)+sizeof(int))+sizeof(int)=24

虽然现在看起来多了四个字节,但如果继承关系复杂了就会显示出虚拟继承的优越性了。但是由于虚拟继承的将会给程序带来相当的复杂度和执行开销,所以最好不用和少用。

[此贴子已经被作者于2006-5-31 18:59:19编辑过]


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-05-31 18:58
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 
以下是引用aogun在2006-5-31 9:32:00的发言:
wfpb,你是说反了,使用虚基类那么间隔重复继承下的基类中的数据只会有一份拷贝
A
/ \
B C
\ /
D
这种继承很有名,叫菱形继承,你可以查查资料
lz,为什么多了那么多字节是因为虚拟继承下的类中为了实现虚拟继承加了虚函数表这种东西,所以sizeof计算出来的内存空间包含了虚函数表所占的空间

注意:没有虚拟函数就不会创建虚表,也就不会有虚拟指针。即便是有,在计算类的大小时也不会将虚表所占的空间计算在内,而只是计算一个虚表指针的空间。作为版主可不应该犯这样的错误

[此贴子已经被作者于2006-5-31 19:06:02编辑过]


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-05-31 19:04
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏
得分:0 
同意13楼的说法.
VTABEL机制只用于有virtual function的class中.......
就算是有虚函数的类,这个VTABEL函数指针数组并不占用空间......
this is virtual inherit,it is't virtual function

E-mail/MSN: stylev@
2006-05-31 21:21
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏
得分:0 
还有....6楼版主也说错了...
只是我不想先当"韩寒",让给了西部天狼

E-mail/MSN: stylev@
2006-05-31 21:22
偶成
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2006-3-4
收藏
得分:0 
了解了...

几年前,丢失了求知欲,游荡在游戏世界中. 而今寻找回了求知欲,希望通过自学充实自己.努力中...
2006-05-31 21:32
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 
以下是引用stylev在2006-5-31 21:21:00的发言:
同意13楼的说法.

VTABEL机制只用于有virtual function的class中.......

就算是有虚函数的类,这个VTABEL函数指针数组并不占用空间......

this is virtual inherit,it is't virtual function

不对,绝对要占用对象的空间,这是C++规范明确规定的。当然这应该是由编译器添加到程序中的。不信可以试试


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-05-31 22:56
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
收藏
得分:0 
//VITABEL数组占4字节.....sorry

#include <iostream>

using namespace std;
#if 1
class aaa
{
	public:
	virtual void a(){}
	private:
};

class bbb:public aaa
{
	public:
	virtual void a(){}
};

int main()
{
	cout << sizeof(aaa) << endl
			<< sizeof(bbb) << endl;
}
#endif


E-mail/MSN: stylev@
2006-05-31 23:53
ooooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2005-6-24
收藏
得分:0 
虚函数表是一个函数指针数组
具有虚函数的类存在一个指向函数指针数组的指针占四字节
所以无论这个类有多少个虚函数或纯虚函数类的大小是数据成员大小加4

2006-06-01 07:35
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
抱歉,回答问题时糊涂了一下,不知怎的就答成了虚函数表了,多谢西部天狼指出我的错误,看来下次不能一边写工作代码一边回答问题了

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-01 10:47
快速回复:关于虚基类问题
数据加载中...
 
   



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

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