2013-05-28 2 views
4

불행히도 나를 당황하게하는 기본적인 C++ 질문이 있습니다. 최근에 다운 캐스팅을 사용하여 클래스의 개인 멤버에 액세스하기 위해 다운 캐스팅을 사용하는 기사를 보았습니다. 내 질문은 왜 작동합니까? 분명히 class P private 멤버에 대한 액세스 권한을 얻는C++ 상위 클래스의 private 멤버에 액세스

class hackP: public P { 
public: 
dummy *m_p; 
}; 

다음과 같이 내가 형 더미의 개인 회원 m_p *와 부모 클래스 P가 점을 감안

는 사용 방법은 해킹 클래스 hackP을 만드는 것이 었습니다 m_p

P parent = ...; 
hackP *hp = (hackP*)&parent; 
// access parent m_p as hp->m_p 

과 같은 코드 스 니펫을 사용하면 도움이 될 것입니다.

+0

음, m_p는 공개 되었습니까? 해킹이 뭐야? –

+0

@MichaelDorgan : 그것은'hackP'에서 공개되었지만'P'에서 사적인 것과 같은 오프셋을 점유하고있는 것으로 추정됩니다. 그건 해킹입니다. –

+0

알았습니다. 감사. –

답변

5

GotW #76Uses and Abuses of Access Rights이 주제를 매우 잘 다루고 있으며, 내가 그걸 모르는 재미있는 정리 비트를 집어 들었다고해야합니다.

이 기사 Access to private members. That's easy!은 머리를 감싸는 데 더 많은 노력이 필요하지만 더 유연 해 보입니다.

이 스레드에서이 answer이 매우 비슷하지만 동일하지 않은 것은 레이아웃이 access-qualifier 섹션간에 동일하지 않을 것이므로이 정의되지 않은 동작임을 나타냅니다. 동일한 액세스 제어 (11 항)와 (비 노조)의

비 정적 데이터 멤버 클래스 나중에 이렇게 할당 다음 draft C++ standard에서 섹션 9.2클래스 멤버은 (강조 광산)를 말한다 회원은 클래스 개체 내에서 주소가 더 높은 입니다. 다른 액세스 제어가있는 비 정적 데이터 구성원의 할당 순서는 지정되지 않습니다. (11).

+0

참조 GotW # 76 및 개인 회원 해킹 정의 된 동작을 많이 감사하겠습니다. 특히 후자. 필자는 컴파일러에서 해킹을 시도해야하며, 제공된 dll로 작업 중이므로 다시 컴파일 할 수 없으므로 어떻게되는지 확인해야합니다. 답장을 보내 주셔서 감사합니다. –

관련 문제