3

私は2つのクラスを持っています:

class base
{
protected:
   int x;
};

class der: public base
{
   void Acc(base& b)
   {
      b.*(&der::x) = 5;
   }
};

この方法 (&der::x) で基本保護されたメンバーにアクセスしても安全ですか? 間違った変数を指すのではないかと心配しています。


これは、基底クラス オブジェクトの保護されたメンバーにアクセスして渡す方法です。

ここに画像の説明を入力

上記のコード:

ここに画像の説明を入力

4

5 に答える 5

1

下の行がわかりにくい方へ

b.*(&der::x) = 5;

次のように記述できます。

b.*(&(der::x)) = 5;

x基本クラスと派生クラスで名前が付けられた変数が 1 つしかないため、スコープ解決演算子は省略できます。

b.*(&x) = 5;

これは、アドレスを取得してxから再度逆参照することに他なりません。次のように記述できます。

b.x = 5;

ご承知おきいただければ幸いです。b.xただし、 「b.*(&der::x) = 5;」の代わりに使用すると、コードはコンパイルされません。「x」は保護されており、これは、書き込みを妨げるコンパイラ規則をバイパスするために使用されますb.x = 5;

于 2013-08-08T04:20:25.713 に答える
0

あなたがしていることは暗黙のキャストです、それは書くことと同じことですstatic_cast<der&>(b).x = 5;

b引数が常に type であることを確認できる限り、安全ですder。から派生した他の型で呼び出すとどうなりますbaseか? そのタイプはx以外のものに使用できますder

class nuclear_submarine: public base {};

void dostuff(der d)
{
   nuclear_submarine ns;
   d.Acc(ns); // *poff*
}
于 2013-08-08T07:18:14.547 に答える
0

はい、安全ですが、少し奇妙で、読者を混乱させる可能性があります。

于 2013-08-08T03:40:42.387 に答える