2012-03-27 103 views
0

爲什麼在下面的代碼中是sizeof(X) == 4sizeof(Y) == 8基類,繼承類sizeof()

此外,在類X,爲什麼成員函數不佔用任何內存空間?

class X { 
    int i; 
public: 
    X() { i = 0; } 
    void set(int ii) { i = ii; } 
    int read() const { return i; } 
    int permute() { return i = i * 47; } 
}; 

class Y : public X { 
    int i; // Different from X's i 
public: 
    Y() { i = 0; } 
    int change() { 
     i = permute(); // Different name call 
     return i; 
    } 
    void set(int ii) { 
     i = ii; 
     X::set(ii); // Same-name function call 
    } 
}; 


    cout << "sizeof(X) = " << sizeof(X) << endl; 
    cout << "sizeof(Y) = " << sizeof(Y) << endl; 

回答

2

Y類的對象有兩個整數成員;類X的對象有一個。您的意見表示YiXi不同,因此看起來您已經知道答案。

請參閱http://codepad.org/PZsiyFIk瞭解Y類的一個對象實際上有兩個i成員的示例。

代碼贅述:

#include <iostream> 
using namespace std; 

class X { 
    int i; 
public: 
    X(): i(4) {} 
    int getI() {return i;} 
}; 

class Y: public X { 
    int i; 
public: 
    Y(): i(10) {} 
    int getMyI() {return i;} 
}; 

int main() { 
    Y y; 
    cout << y.getI() << ' ' << y.getMyI() << '\n'; 
} 

輸出

4 10 

有在main只有一個對象叫y。請注意,y必須有兩個i字段才能使輸出有意義。

+0

我從一本書的代碼複製。 :)現在我明白了。但如何使用這兩個差異我不是很清楚。 – user1279988 2012-03-27 05:27:40

+0

添加到我的答案。希望能幫助到你。 – 2012-03-27 05:28:55

+0

我看到了codeepad中的代碼。謝謝你的回答! – user1279988 2012-03-27 05:32:15

0

X的大小是4,因爲它有一個INT I

的Y大小是8,因爲基類I +派生類我

成員函數,除非如果你有一個虛擬函數不接受尺寸的那麼爲了存儲vpointer它將有4個字節。

+0

我知道,謝謝你的回答。它有兩個i值 – user1279988 2012-03-27 05:26:07

1

X是基類。只有一個數據成員,即:int i。 Y源自X並具有其自己的和派生的數據記憶。即:兩個int i s。

1

此外,在類X中,爲什麼成員函數不佔用任何內存空間?

我認爲還沒有人覆蓋此部分。類的成員函數不存儲在對象本身內,因爲它們屬於類而不是對象。沒有理由在每個對象中存儲函數的副本,因爲代碼始終保持不變。

sizeof(X)返回存儲X類型實例所需的字節數,而不是整個類。

此外,一個成員函數像任何其他正常的c函數一樣存儲在內存中。它只是需要一個指向對象的指針,它被稱爲來自:

int X::permute() { return i = i * 47; } 
... 
someX.permute(); 

假作:

int permute(X* _x) { return _x->i = _x->i * 47; } 
... 
permute(&someX); 

的成員函數的想法僅僅是一個抽象供我們使用。對象實際上唯一包含的成員變量,也許是一個虛擬函數表。