【发布时间】:2013-05-23 17:34:04
【问题描述】:
不幸的是,我有一个基本的 C++ 问题让我感到困惑。最近我遇到了一篇文章,它使用向下转换来访问使用向下转换的类的私有成员。我的问题是它为什么有效?
鉴于我有一个父类 P,它有一个 dummy* 类型的私有成员 m_p,那么使用的方法是创建一个 hack 类 hackP,如下所示:
class hackP: public P {
public:
dummy *m_p;
};
显然可以使用类似 sn-p 的代码访问 class P
私人成员 m_p
P parent = ...;
hackP *hp = (hackP*)&parent;
// access parent m_p as hp->m_p
任何帮助将不胜感激。
【问题讨论】:
-
嗯,m_p 是公开的吗?有什么技巧?
-
您可以通过使 hackP 不从 P 继承来做到这一点,只要 HP 和 P 之间的类使用该类型转换完美对齐(不是一个好主意)。但是继承部分让我感到困惑,因为这应该改变内存中的签名足以打破它。
-
除了代码中的错误(正如@MichaelDorgan 提到的,不应该有继承)这是未定义的行为。因此,就标准而言,它起作用的唯一原因是纯属运气。
-
@PaulTarr:你有这篇文章的链接吗?我认为翻译中遗漏了一些东西。
-
GotW #76 似乎相关:gotw.ca/gotw/076.htm
标签: c++ class private member undefined-behavior