2013-02-21 48 views
0

我是C++編程的新手,對於包含虛擬成員函數的類的大小有疑問。請通過我的以下代碼:包含虛擬成員函數的類的大小

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class BaseClass 
{ 
private: 
    int a, b; 
public: 
    BaseClass() 
    { 
     a = 10; 
     b = 20; 
    } 

    virtual int area() 
    { 
     return 0; 
    } 
}; 

class DerivedClass1 : public BaseClass 
{ 
    int x; 

public: 
    virtual void simple() 
    { 
     cout << "inside simple" << endl; 
    } 
}; 

int main() 
{ 
    DerivedClass1 Obj; 
    cout << sizeof(Obj) << endl; // Displays 16 bytes 

    return 0; 
} 

上面的代碼顯示大小爲16個字節。根據我的說法,它應該顯示20個字節,因爲兩個虛擬指針(一個從基類繼承,一個由於它自己的虛函數而被添加到派生類本身)+ Derived Class中的三個數據成員等於20個字節。所以請給我解釋一下它是怎麼回事......

+0

繼承虛擬指針_and_添加另一個?爲什麼會發生? – jogojapan 2013-02-21 05:38:02

+2

閱讀[虛擬表](http://en.wikipedia.org/wiki/Virtual_method_table) – borisbn 2013-02-21 05:38:04

+1

如果您有多個繼承,則只有其他vptrs纔會出現。另外,您的實驗結果非常依賴於編譯器和平臺;當[使用g ++編譯](http://liveworkspace.org/code/10xj5R$10)時,它會輸出24,與構建64位可執行文件時的VS2012一樣。 – Praetorian 2013-02-21 05:52:00

回答

1

在這種情況下,因爲虛擬表指針在整個類層次結構中是公共的。因此,BaseClass已經具有虛函數,DeriveClass1中的附加虛函數將不會爲類的大小添加任何內容。

這是你的類的內存佈局:

class DerivedClass1 size(16): 
    +--- 
    | +--- (base class BaseClass) 
0 | | {vfptr} 
4 | | a 
8 | | b 
    | +--- 
12 | x 
    +--- 

Derivedass1::[email protected]: 
    | &DerivedClass1_meta 
    | 0 
0 | &BaseClass::area 
1 | &DerivedClass1::simple 

您可以使用-d1reportAllClassLayout選項時,編譯MVSC顯示類的內存佈局。

+0

派生類函數是否有可能變大? – 2015-06-05 19:38:03

+0

當BaseClass沒有任何虛函數時,但是在DeriveClass中有一個或多個虛函數。在這種情況下,與BaseClass相比,DerivedClass中的vfptr(4bytes)更多(不包含vfptr)。 – HappyTran 2015-06-06 04:08:45