这个C ++程序中发生了什么?

时间:2015-09-29 14:26:28

标签: c++ private encapsulation reinterpret-cast

我正在阅读这篇优秀的文章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的物体布局不能保证相同,尽管在实践中它们可能总是如此? 这个程序定义得很好吗?

2 个答案:

答案 0 :(得分:2)

投射将私有区域重新映射到新结构中的公共区域。由于未在内部设置布局,因此无法保证此行为(尽管可能稳定)。

与抓取指针并在其中写入内容完全没有什么不同,尽管它的完成方式更精确。

答案 1 :(得分:0)

见[http://en.cppreference.com/w/cpp/language/reinterpret_cast]

你基本上告诉编译器你的对象实际上是一个BaitAndSwitch对象,它实际上会按你所说的去做: - )