#include <iostream>
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
(reinterpret_cast<BaitAndSwitch&>(x)).Value();
}
int main()
{
X x;
std::cout << f(x) << "\n"; // prints 0, not 1
return 0;
};
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgWCAKeyAKcHVibGljOgogIFgoKSA6IHByaXZhdGVfKDEpIHsgLyouLi4qLyB9Cgpwcml2YXRlOiAKICBpbnQgVmFsdWUoKSB7IHJldHVybiBwcml2YXRlXzsgfQogIGludCBwcml2YXRlXzsgCn07CgovLyBOYXN0eSBhdHRlbXB0IHRvIHNpbXVsYXRlIHRoZSBvYmplY3QgbGF5b3V0Ci8vIChjcm9zcyB5b3VyIGZpbmdlcnMgYW5kIHRvZXMpLgovLwpjbGFzcyBCYWl0QW5kU3dpdGNoCiAgICAvLyBob3BlZnVsbHkgaGFzIHRoZSBzYW1lIGRhdGEgbGF5b3V0IGFzIFgKeyAgIC8vIHNvIHdlIGNhbiBwYXNzIGhpbSBvZmYgYXMgb25lCnB1YmxpYzoKICBpbnQgVmFsdWUoKSB7IHJldHVybiBwcml2YXRlXzsgfQpwcml2YXRlOgogIGludCBwcml2YXRlXzsKfTsKCmludCBmKCBYJiB4ICkKewogIC8vIGV2aWwgbGF1Z2h0ZXIgaGVyZQogIChyZWludGVycHJldF9jYXN0PEJhaXRBbmRTd2l0Y2gmPih4KSkuVmFsdWUoKTsKfQoKaW50IG1haW4oKQp7CiAgICBYIHg7CiAgICBzdGQ6OmNvdXQgPDwgZih4KSA8PCAiXG4iOyAvLyBwcmludHMgMCwgbm90IDEKICAgIHJldHVybiAwOwp9Ow==