访问c ++父类的私有成员

时间:2013-05-28 16:42:23

标签: c++ class private member undefined-behavior

我有一个基本的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

任何帮助都将不胜感激。

1 个答案:

答案 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)。