我正在阅读这篇优秀的文章Uses & Abuses of Access Rights。我不明白以下的例子。
文件: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的物体布局不能保证相同,尽管在实践中它们可能总是如此? 这个程序定义得很好吗?
答案 0 :(得分:2)
投射将私有区域重新映射到新结构中的公共区域。由于未在内部设置布局,因此无法保证此行为(尽管可能稳定)。
与抓取指针并在其中写入内容完全没有什么不同,尽管它的完成方式更精确。
答案 1 :(得分:0)
见[http://en.cppreference.com/w/cpp/language/reinterpret_cast]
你基本上告诉编译器你的对象实际上是一个BaitAndSwitch
对象,它实际上会按你所说的去做: - )