Я читал эту прекрасную статью Использование и злоупотребление правами доступа. . Я не понял следующий пример из этого.
Файл: x.h
class X
{
public:
X() : private_(1) { /*...*/ }
template<class T>
void f( const T& t ) { /*...*/ }
int Value() { return private_; }
private:
int private_;
};
Файл: break.cpp
#include "x.h"
#include <iostream>
class BaitAndSwitch
// hopefully has the same data layout as X
{ // so we can pass him off as one
public:
int notSoPrivate;
};
void f( X& x )
{
// evil laughter here
(reinterpret_cast<BaitAndSwitch&>(x)).notSoPrivate = 2;
}
int main()
{
X x;
std::cout<<x.Value()<<'\n';
f(x);
std::cout<<x.Value()<<'\n';
}
Как работает эта программа? Что на самом деле происходит в глобальной функции f()? Пожалуйста, кто-нибудь ясно объясните, как изменяется значение частной переменной?
Почему Херб Саттер сказал, что макеты объектов X и BaitAndSwitch не обязательно будут одинаковыми, хотя на практике они, вероятно, всегда будут такими? Хорошо ли определена эта программа?
reinterpret_cast
ing указатель на указатель на «неправильный» объект вызывает неопределенное поведение. Этот UB может оказаться именно тем, что вы хотели, но бессмысленно рассуждать и опасно полагаться на него. - person 5gon12eder   schedule 29.09.2015The code in Example 3 is illegal for two reasons: 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.
- person hlscalon   schedule 29.09.2015#define private public
работает лучше, просто говорю xD - person   schedule 29.09.2015