【发布时间】:2014-07-22 18:57:22
【问题描述】:
我正在阅读有关结构和结构填充的内容,并编写了这段代码。它使用与 a 的地址偏移来编辑结构的私有成员。这是否意味着您可以参加某人制作的课程并提取/更改私有变量和函数?
#include <iostream>
typedef struct x {
int a;
private:
int b;
public:
//Init
x(int a, int b) : a(a) , b(b){}
void print(){
//Print values
std::cout << a << " " << b << std::endl;
}
} x;
int main()
{
struct x s(10,20) ;
int *p = (int *)(((char*)&s)+4); //4 Byte offset from a (a is at base)
s.print();
(*p) +=1;
s.print();
//Stops terminal closing
int junk;
std::cin >> junk;
return 1;
}
【问题讨论】:
-
不,这只是未定义的行为。
-
private 是为了防止墨菲,而不是马基雅维利。
-
我已经用它来证明其他人的代码中存在错误(通过“修复”他们的私人成员数据)。更简洁的方法是使用新名称为类创建自己的标题,并且所有内容都是公开的,然后重新解释从一个到另一个的强制转换。只是,拜托,为了理智,这样做只是为了暂时的骇人听闻的目的。然而,知道这一点是件好事,因为否则人们会依赖私有来做它不做的事情。