2012-03-27 1 views
0

이유는 다음 코드에서 sizeof(X) == 4sizeof(Y) == 8입니까?기본 클래스, 상속 클래스 크기()

또한 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의 객체에는 2 개의 정수 멤버가 있습니다. 클래스 X의 객체에는 하나가 있습니다. 귀하의 의견은 YiXi과 다르다는 것을 나타내므로 이미 답변을 알고있는 것으로 보입니다.

Y 클래스의 개체에 실제로 두 개의 i 멤버가있는 예제는 http://codepad.org/PZsiyFIk을 참조하십시오.

코드는 여기에 반복 :

#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 

y라는 main에 하나의 개체가. 출력을 이해하려면 y에 두 개의 i 필드가 있어야합니다. 그것은 int를 가지고 있기 때문에 X의

+0

도서 코드에서 복사합니다. :) 이제 알았어. 그러나이 두 가지 diff i를 사용하는 방법에 대해서는 명확하지 않습니다. – user1279988

+0

내 답변에 추가되었습니다. 희망이 도움이됩니다. –

+0

코드를 코드 봤어요. 답변을 주셔서 감사합니다! – user1279988

0

크기는 4 전

Y의 크기 때문에 수업 당신이 가상 함수가있는 경우를 제외 크기를 고려하지 않습니다 내가

회원 기능을 유도 + 기본 클래스의 8 그런 다음 vpointer를 저장하기 위해 4 바이트를 갖습니다.

+0

나는 알고있다, ur 대답에 대해 감사한다. 두 개의 i 값을가집니다. – user1279988

1

X는 기본 클래스입니다. 데이터 멤버가 하나만 있습니다 (예 : int i). Y는 X에서 파생되며 고유 한 파생 데이터 멤버를가집니다. 예 : 두 int i s.

1

또한 클래스 X에서 멤버 함수가 메모리 공간을 차지하지 않는 이유는 무엇입니까?

아무도이 부분을 아직 다루지 않았다고 생각합니다. 클래스의 멤버 함수는 객체가 아닌 클래스에 속해 있기 때문에 객체 자체에 저장되지 않습니다. 코드가 항상 동일하기 때문에 각 객체 내에 함수 복사본을 저장할 이유가 없습니다.

sizeof(X)은 전체 클래스가 아닌 X 유형의 인스턴스를 저장하는 데 필요한 바이트 수를 반환합니다.

또한 멤버 함수는 다른 일반 c 함수와 마찬가지로 메모리에 저장됩니다. 멤버 함수의 개념은 우리가 사용하는 경우에만 추상화입니다

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

:

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

가로 바뀝니다 : 그것은 단지 그것에서 불리는 객체에 대한 포인터를합니다. 객체가 실제로 구성하는 유일한 것은 멤버 변수와 가상 함수 테이블 일 수 있습니다.