x64環境下實現:
1 #include <iostream> 2 3 using namespace std; 4 5 class kong{ 6 7 }; 8 9 class kong1{ 10 11 }; 12 13 class kong2{ 14 15 }; 16 17 class data2 18 { 19 int a; //4個字節 20 char s; 21 }; 22 23 class data3 24 { 25 int a; 26 char s; 27 virtual void kong(); //在64位系統分配指針大小為8字節 28 virtual void kong1(); 29 }; 30 31 class data4 : public data3 32 { 33 34 }; 35 36 class data5 : virtual public data3 37 { 38 39 }; 40 41 class data6 : public data3 42 { 43 virtual void kong(); 44 }; 45 46 class data7 : virtual public data3 47 { 48 virtual void kong(); 49 }; 50 51 class data8 : public data2 52 { 53 virtual void kong(); 54 }; 55 56 class data9 : public data2 57 { 58 59 }; 60 61 class data10 : virtual public data2 62 { 63 virtual void kong(); 64 }; 65 66 class data11 : virtual public data2 67 { 68 69 }; 70 71 int main() 72 { 73 //c++要求每個實例在內存中都有獨一無二的地址。空類也會被實例化,所以編譯器會給空類隱含的添加一個字節,這樣空類實例化之后就有了獨一無二的地址了。所以空類的sizeof為1 74 kong ko; 75 cout << sizeof(ko) << " " << sizeof(kong) << endl; 76 77 //包含了對齊,64位int型4個字節 78 data2 da; 79 cout << sizeof(da) << " " << sizeof(data2) << endl; 80 81 //C++ 類中有虛函數的時候有一個指向虛函數的指針(vptr),在32位系統分配指針大小為4字節,在64位系統分配指針大小為8字節。無論多少個虛函數,只有這一個指針,8字節 82 cout << sizeof(data3) << endl; 83 84 //data3類(包含virtual),data4(不包含virtual)直接繼承data3 輸出為16, C++ 類中有虛函數的時候有一個指向虛函數的指針(vptr),在64位系統分配指針大小為8字節。無論多少個虛 85 //函數,只有這一個指針,8字節。並且子類的大小是本身成員變量的大小加上父類的大小。 父類16 子類0 86 cout << sizeof(data4) << endl; 87 88 //若data5(不包含virtual)虛繼承data3, 輸出為24, 父類16加上子類的virtual(8),指針8 89 cout << sizeof(data5) << endl; 90 91 //data3類(包含virtual),data6(包含virtual)直接繼承data3 輸出為16, 原因:如果子類直接繼承父類,他們是共享一個虛函數指針 92 cout << sizeof(data6) << endl; 93 94 //若是data7(包含virtual)虛繼承data3,輸出為24, 父類16,子類虛函數指針8 輸出24 95 cout << sizeof(data7) << endl; 96 97 //data2類(不包含virtual),data8(包含virtual)直接繼承 輸出為16, 父類為8 子類虛函數指針8 輸出為16 98 cout << sizeof(data8) << endl; 99 100 //若data9(不包含virtual)直接繼承data2類(不包含virtual),輸出為8, 父類8 子類0 輸出8 101 cout << sizeof(data9) << endl; 102 103 //data10(包含virtual)虛繼承data2類(不包含virtual), 輸出為 24, 父類為8 ,虛基類指針為8,子類虛函數指針8 輸出為24 104 cout << sizeof(data10) << endl; 105 106 //data11(不包含virtual)虛繼承data2類(不包含virtual), 輸出為 16, 父類為8 ,虛基類指針為8, 輸出為16 107 cout << sizeof(data11) << endl; 108 109 110 //如果有多個virtual函數,只有一個指針 111 //若子類虛繼承,則子類有自己的一個虛函數指針 112 //子類直接繼承父類,若父中由virtual,則父子共享一個指針用來指定虛函數的虛擬函數表的入口地址 113 114 return 0; 115 }
結果(單位:字節):