我有一个基本的C ++问题,不幸让我感到困惑。最近我遇到了一篇文章,该文章使用向下转换来使用向下转换来访问类的私有成员。我的问题是它为什么有效?
鉴于我有一个父类P,其私有成员m_p的类型为dummy *,那么使用的方法是创建一个hack类hackP,如下所示:
class hackP: public P {
public:
dummy *m_p;
};
显然可以使用
等代码段访问class P
私有成员m_p
P parent = ...;
hackP *hp = (hackP*)&parent;
// access parent m_p as hp->m_p
任何帮助都将不胜感激。
答案 0 :(得分:5)
GotW #76
Uses and Abuses of Access Rights看起来很好地涵盖了这个主题,我不得不说我从中拾取了一些我不知道的有趣的tid位。
这篇文章Access to private members. That's easy!需要更多努力来解决问题,但似乎更灵活。
来自此线程answer的此Is private member hacking defined behaviour?非常相似但不相同似乎表明这是未定义的行为,因为access-qualifier
部分之间的布局不能保证相同。从draft C++ standard部分9.2
类成员说(强调我的):
具有相同访问权限的(非联合)类的非静态数据成员 控制(第11条)被分配,以便后来的成员有更高的 类对象中的地址。 非静态分配的顺序 具有不同访问控制的数据成员未指定(11)。