20

C ++では、メンバーを基本クラスに入れ、同じ名前のメンバーを継承されたクラスに入れることができます。

継承されたクラスの特定のものにアクセスするにはどうすればよいですか?

4

7 に答える 7

36

その場合、メンバー名を完全修飾する必要があります。

class A
{
public:
  int x;
};


class B : public A
{
public:
  int x;
  B() 
  { 
    x = 0;
    A::x = 1;
  }
};
于 2010-04-13T16:05:59.753 に答える
9

名前を指定すると、継承されたクラスの名前に自動的にアクセスします。基本クラスのアクセス方法を意味する場合は、 Base::member を使用します

于 2010-04-13T16:06:19.710 に答える
8

基本クラスの隠しメンバーにアクセスするには、メンバー名の前に基本クラス名を付ける必要があります。下記参照:

class A
{
protected:
   int i;
};

class B : public A
{
public:
   void foo( void )
   {
      int a_i = A::i;
      int b_i = i;
      int b_i_as_well = B::i;
   }
private:
   int i;
};
于 2010-04-13T16:06:49.360 に答える
6

1つのアプローチ(他のすべての回答ですでに言及されています)は、のような修飾メンバー名を使用することBase::memberです。thisそれがあなたのスタイルであれば、ポインタを介した明示的なアクセスと組み合わせて使用​​ できますthis->Base::member

もう 1 つの方法はthis、基本クラスの型に明示的に変換されたポインターを介してアクセスを実行することです((Base *) this)->member

もちろん、上記のthisポインターへの参照は、クラスの非静的メンバー関数内からメンバーにアクセスしようとしているという前提で行われています。「外部」から if にアクセスするには、同じトリックを他のポインター (または参照) に適用できsome_pointer->Base::memberます((Base *) some_pointer)->member

データ メンバーの場合、これら 2 つのアプローチは同等です。メンバー関数の場合、仮想関数では異なる結果になる可能性があります。このため、一般に、最初のアプローチが優先されます。

于 2010-04-13T16:26:13.767 に答える
5

はい。

f()呼び出しをクラス名で修飾します: SpecificClass::f()

于 2010-04-13T16:06:40.443 に答える
4

を前に付けることによりclassname::

于 2010-04-13T16:06:01.567 に答える