从这个问题的讨论中,如何在 C++ 中实现私有变量的访问?我提出了一种变体:可以通过强制转换和依赖布局兼容性来调用私有成员函数,而不是访问私有数据成员吗?
一些代码(灵感来自 Herb Sutter 的专栏Uses and Abuse of Access Rights)
#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
return (reinterpret_cast<BaitAndSwitch&>(x)).Value();
}
int main()
{
X x;
std::cout << f(x) << "\n"; // prints 0, not 1
return 0;
};
注意:这有效(至少在 Ideone 上)!新的C++11 标准有什么方法可以通过依赖布局兼容性和 reinterpret_cast / static_cast提供有保证的或至少是实现定义的方法来规避访问控制?
EDIT1:Ideone 上的输出
EDIT2:在 Sutter 的专栏中,他列出了上述代码不能保证有效的两个原因(尽管它在实践中有效)
a) X 和 BaitAndSwitch 的对象布局不能保证相同,尽管实际上它们可能总是相同。
b) reinterpret_cast 的结果是未定义的,尽管大多数编译器会让你尝试按照黑客的意图使用生成的引用。
新的 C++11 标准现在是否提供这些 layout / reinterpret_cast 保证?