关于虚函数和虚继承的一点思考

今天写了个测试程序
 1#include "stdafx.h"
 2#include "iostream"
 3
 4using namespace std;
 5
 6class a{
 7public:
 8    char k[3];
 9    virtual int aa();
10}
;
11
12class b:public virtual a
13{
14
15public:
16    char m[3];
17    virtual int bb();
18}
;
19
20class c: public virtual b
21{
22public:
23    char s[3];
24    virtual int cc();
25}
;
26
27int _tmain(int argc, _TCHAR* argv[])
28{
29
30    cout<<"sizeof(a)=:"<<sizeof(a)<<endl;
31    cout<<"sizeof(b)=:"<<sizeof(b)<<endl;
32    cout<<"sizeof(c)=:"<<sizeof(c)<<endl;
33
34    return 0;
35}
运行结果为:

这个结果很容易理解,sizeof(a)为 aa[3] + 虚指针的大小,也即4+4 = 8(经过一次数据对齐)。
sizeof(b)就为 b自身的大小8 + sizeof(a)+指针大小 = 8 +8 +4 = 20;
sizeof(c)和b的大小算法类似 为 =8+ 20 + 4 =32

那如果程序改成非虚继承那么结果是什么样呢?

 1#include "stdafx.h"
 2#include "iostream"
 3
 4using namespace std;
 5
 6class a{
 7public:
 8    char k[3];
 9    virtual int aa();
10}
;
11
12class b:public a
13{
14
15public:
16    char m[3];
17    virtual int bb();
18}
;
19
20class c: public b
21{
22public:
23    char s[3];
24    virtual int cc();
25}
;
26
27int _tmain(int argc, _TCHAR* argv[])
28{
29
30    cout<<"sizeof(a)=:"<<sizeof(a)<<endl;
31    cout<<"sizeof(b)=:"<<sizeof(b)<<endl;
32    cout<<"sizeof(c)=:"<<sizeof(c)<<endl;
33
34    return 0;
35}

36
运行结果为:


那么这个结果就有点意思,到底是为什么呢?
http://www.diybl.com/course/3_program/c++/cppjs/2007927/74925.html有详细的解释。

posted on 2011-12-01 10:06 sheng 阅读(348) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(1)

随笔档案

收藏夹

同行

搜索

最新评论

阅读排行榜

评论排行榜