4

残念ながら私を困惑させる基本的な C++ の質問があります。最近、ダウンキャストを使用してクラスのプライベート メンバーにアクセスする記事に出くわしました。私の質問は、なぜそれが機能するのですか?

ダミー * 型のプライベート メンバー m_p を持つ親クラス P がある場合、使用されるメソッドは、次のようにハック クラス 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

どんな助けでも大歓迎です。

4

1 に答える 1

5

GotW #76 Uses and Abuses of Access Rightsがこのトピックをかなりうまくカバーしているように見えます。

この記事の非公開メンバーへのアクセス。簡単だ!頭を包み込むにはもう少し手間がかかりますが、より柔軟に見えます。

このスレッドからのこの回答Is private member hacking defined behaviour? access-qualifierこれは非常によく似ていますが、セクション間でレイアウトが同じであることが保証されていないため、これが未定義の動作であることを示しているよう です。ドラフト C++ 標準から、セクション9.2 Class membersは次のように述べています (強調鉱山):

同じアクセス制御 (条項 11) を持つ (非共用体) クラスの非静的データ メンバーは、後のメンバーがクラス オブジェクト内でより高いアドレスを持つように割り当てられます。アクセス制御が異なる非静的データメンバーの割り当て順序は規定されていません(11)。

于 2013-05-28T17:02:23.040 に答える