關(guān)于虛函數(shù)和虛繼承的一點思考
今天寫了個測試程序

這個結(jié)果很容易理解,sizeof(a)為 aa[3] + 虛指針的大小,也即4+4 = 8(經(jīng)過一次數(shù)據(jù)對齊)。
sizeof(b)就為 b自身的大小8 + sizeof(a)+指針大小 = 8 +8 +4 = 20;
sizeof(c)和b的大小算法類似 為 =8+ 20 + 4 =32
那如果程序改成非虛繼承那么結(jié)果是什么樣呢?
運行結(jié)果為: 1
#include "stdafx.h"
2
#include "iostream"
3
4
using namespace std;
5
6
class a{
7
public:
8
char k[3];
9
virtual int aa();
10
};
11
12
class b:public virtual a
13
{
14
15
public:
16
char m[3];
17
virtual int bb();
18
};
19
20
class c: public virtual b
21
{
22
public:
23
char s[3];
24
virtual int cc();
25
};
26
27
int _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
}
運行結(jié)果為:
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35


這個結(jié)果很容易理解,sizeof(a)為 aa[3] + 虛指針的大小,也即4+4 = 8(經(jīng)過一次數(shù)據(jù)對齊)。
sizeof(b)就為 b自身的大小8 + sizeof(a)+指針大小 = 8 +8 +4 = 20;
sizeof(c)和b的大小算法類似 為 =8+ 20 + 4 =32
那如果程序改成非虛繼承那么結(jié)果是什么樣呢?
1
#include "stdafx.h"
2
#include "iostream"
3
4
using namespace std;
5
6
class a{
7
public:
8
char k[3];
9
virtual int aa();
10
};
11
12
class b:public a
13
{
14
15
public:
16
char m[3];
17
virtual int bb();
18
};
19
20
class c: public b
21
{
22
public:
23
char s[3];
24
virtual int cc();
25
};
26
27
int _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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36


那么這個結(jié)果就有點意思,到底是為什么呢?
http://www.diybl.com/course/3_program/c++/cppjs/2007927/74925.html有詳細的解釋。