2013-05-28 5 views
4

У меня есть основной вопрос на C++, который, к сожалению, меня озадачивает. Недавно я наткнулся на статью, которая использует down-casting для доступа к частному члену класса, используя down-casting. Мой вопрос, почему он работает?Доступ к частному члену родительского класса C++

Учитывая, что у меня есть родительский класс Р с частным члена m_p типа манекена *, то метод использовался для создания класса хак hackP следующим образом:

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

, по-видимому получает доступ к class P частному члену m_p используя фрагмент кода, как

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

Любая помощь будет оценена.

+0

Umm, m_p является общественным? Что такое взлом? –

+0

@MichaelDorgan: Это публично в 'hackP', но предположительно занимает такое же смещение, как и что-то личное в' P'. Это взломать. –

+0

Понял. Благодарю. –

ответ

5

Похоже, что GotW #76Uses and Abuses of Access Rights очень хорошо освещает эту тему, и я должен сказать, что взял некоторые интересные кусочки, которые я не знал об этом.

Эта статья Access to private members. That's easy! требует немного больше усилий, чтобы обернуть голову, но кажется более гибкой.

Этот answer с этой нитью Is private member hacking defined behaviour?, который очень похож, но не идентичен, кажется, указывает, что это неопределенное поведение, так как макет не может быть одинаковым между разделами access-qualifier. Из draft C++ standard, раздел 9.2членов класса говорит (курсив мой):

Нестатические элементы данных а (несращения) класса с тем же доступом управления (пункт 11) распределяются таким образом, чтобы позже члены имеют более высокие адреса в объекте класса. Порядок распределения нестатических элементов данных с различным контролем доступа не указан (11).

+0

Ссылки GotW # 76 и частное поведение, зависящее от хакера, очень оценены. Последнее особенно. Мне просто нужно попробовать взломать мой компилятор и посмотреть, что происходит с тех пор, как я работаю с поставляемой dll и не могу перекомпилировать его. Спасибо за ответ. –

Смежные вопросы