一个虚函数和虚继承的问题。
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                一个虚函数和虚继承的问题。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                這個問題困惑好幾天了。廢話不多說,先上代碼。
1 #include <iostream>
2 using namespace std;
3
4 class A
5 {
6 public:
7 virtual void aa()
8 {
9 }
10 private:
11 char k[3];
12 };
13
14 class B:public A
15 {
16 public:
17 virtual void bb()
18 {
19 }
20 private:
21 char j[3];
22 };
23
24 class C:public B
25 {
26 public:
27 virtual void cc()
28 {
29 }
30 private:
31 char i[3];
32 };
33
34 int main()
35 {
36 A a;
37 B b;
38 C c;
39 cout<<"sizeof(A):"<<sizeof(A)<<endl;
40 cout<<"sizeof(B):"<<sizeof(B)<<endl;
41 cout<<"sizeof(C):"<<sizeof(C)<<endl;
42 return 0;
43 }
44
45 打印結果:
46 sizeof(A):8//A有一個_vfptr的指向虛表的指針(4字節),加上char[3]補足是8字節。
47 sizeof(B):12//B繼承A的全部(8字節),那加上char[3]補足一共是12字節,使用繼承自A的_vfptr指向B的虛表
48 sizeof(C):16//同B的情況,都用A的虛函數表指針指向虛函數表。
49
50 但是如果 B、C虛繼承自A
51 #include <iostream>
52 using namespace std;
53
54 class A
55 {
56 public:
57 virtual void aa()
58 {
59 }
60 private:
61 char k[3];
62 };
63
64 class B:virtual public A
65 {
66 public:
67 virtual void bb()
68 {
69 }
70 private:
71 char j[3];
72 };
73
74 class C:virtual public B
75 {
76 public:
77 virtual void cc()
78 {
79 }
80 private:
81 char i[3];
82 };
83
84 int main()
85 {
86 A a;
87 B b;
88 C c;
89 cout<<"sizeof(A):"<<sizeof(A)<<endl;
90 cout<<"sizeof(B):"<<sizeof(B)<<endl;
91 cout<<"sizeof(C):"<<sizeof(C)<<endl;
92 return 0;
93 }
94
95 在VS2008下打印結果為:
96 sizeof(A):8
97 sizeof(B):20
98 sizeof(C):32
99 而在GCC編譯下,打印結果為:
100 sizeof(A):8
101 sizeof(B):16
102 sizeof(C):24
103
104 這是怎么得到的呢?
105
關于虛繼承這個問題,以下有幾種不同的回復,上截圖:
另一種:
顯然,MS的VS在這方面做了一些優化,跟其他編譯器相比,在派生類中插入了一個偏移值表的指針,也就多了4個字節。
通過派生類來訪問虛基類的上一個從偏移值表里的獲得的偏移量。VS下的內存布局如下:
 |C的虛函數表指針|C的偏移表指針|C的成員變量|A的虛表指針|A的成員變量|B的虛函數表指針|B的偏移表指針|B的成員變量 。 MS為什么通過偏移表來對虛基類的成員進行尋址,我還不曉得。
現在就把摘抄的寫到這里。
=我弄明白,補上。
轉載于:https://www.cnblogs.com/kanego/archive/2011/11/06/2238339.html
總結
以上是生活随笔為你收集整理的一个虚函数和虚继承的问题。的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: PHP 常用字符串处理代码片段
- 下一篇: 挨踢项目求生法则-团队建设篇
