Из обсуждения этого вопроса Как доступ к закрытым переменным реализован в C++ под капотом? Я представил вариант :вместо доступа к частному члену данных: можно ли вызывать частные функции-члены посредством приведения и опираясь на совместимость макета -?
Некоторый код (, вдохновленный колонкой Херба Саттера Использование и злоупотребление правами доступа)
#include
class X
{
public:
X() : private_(1) { /*...*/ }
private:
int Value() { return private_; }
int private_;
};
// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
// hopefully has the same data layout as X
{ // so we can pass him off as one
public:
int Value() { return private_; }
private:
int private_;
};
int f( X& x )
{
// evil laughter here
return (reinterpret_cast(x)).Value();
}
int main()
{
X x;
std::cout << f(x) << "\n"; // prints 0, not 1
return 0;
};
Обратите внимание :это работает (по крайней мере на Ideone )! Есть ли способ, которым новый стандарт C++11 дает гарантированный или, по крайней мере, реализацию -определенный способ обойти контроль доступа, полагаясь на компоновка -совместимость и реинтерпретация _приведение / статическое _приведение?
РЕДАКТИРОВАТЬ1:вывод на Идеоне
РЕДАКТИРОВАТЬ2:В колонке Саттера он перечисляет две причины, по которым приведенный выше код не гарантирует работу (, хотя на практике он работает )
a) The object layouts of X and BaitAndSwitch are not guaranteed to be the same, although in practice they probably always will be.
b) The results of the reinterpret_cast are undefined, although most compilers will let you try to use the resulting reference in the way the hacker intended.
. Предоставляет ли теперь новый стандарт C++11 эти гарантии приведения компоновки/реинтерпретации _?