2014-02-24 2 views
2

왜 작동합니까?C에서 부모에 대한 포인터를 사용하여 하위 클래스 멤버에 액세스

typedef struct { 
    data member_x; 
} base; 

typedef struct { 
    struct base; 
    data member_y; 
} derived; 

void function_on_base(struct base * a); // 여기에 내가 모두에 포인터를 전달할 수 있습니다 파생베이스에 어떻게 그렇게 할 수 있어요?

function_on_base에서 시간 기준 포인터가 파생 된 유형의 포인터를 허용해야하는 이유는 무엇입니까? 그래서이

   sizeof(derived) 
    sizeof(base) 
|-------------------|----------------| 

beginning   end of base  end of derived 
of derived 
AND of base 

을 :

derived my_derived; 
(base)my_derived; 

실제로 derivedsizeof(base) 첫 번째 바이트를 취할 것에 해당하는 메모리에서 derived 구조체이로 표현 될 수 있기 때문에

+0

여기에 질문이 있습니까? –

+0

왜/어떻게 작동합니까? :) – Kam

답변

2

그것은 작동 base struct (사용자가 derived 구조체의 첫 번째 위치에 선언했기 때문에).

함수를 호출하면 암시 적 캐스트이 사용자 모르게 수행되어 간단하게 작동합니다. 암시 적 캐스트를 피하려면 몇 가지 추가 플래그로 컴파일해야합니다. 이 OOP 기능을 "재현"할 수 있기 때문에

비록,이 기능은 주로 C++ 같은 언어로 기존의 C에 사용됩니다.

관련 문제