C ++では、メンバーを基本クラスに入れ、同じ名前のメンバーを継承されたクラスに入れることができます。
継承されたクラスの特定のものにアクセスするにはどうすればよいですか?
その場合、メンバー名を完全修飾する必要があります。
class A
{
public:
int x;
};
class B : public A
{
public:
int x;
B()
{
x = 0;
A::x = 1;
}
};
名前を指定すると、継承されたクラスの名前に自動的にアクセスします。基本クラスのアクセス方法を意味する場合は、 Base::member を使用します
基本クラスの隠しメンバーにアクセスするには、メンバー名の前に基本クラス名を付ける必要があります。下記参照:
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;
};
1つのアプローチ(他のすべての回答ですでに言及されています)は、のような修飾メンバー名を使用することBase::memberです。thisそれがあなたのスタイルであれば、ポインタを介した明示的なアクセスと組み合わせて使用 できますthis->Base::member。
もう 1 つの方法はthis、基本クラスの型に明示的に変換されたポインターを介してアクセスを実行することです((Base *) this)->member。
もちろん、上記のthisポインターへの参照は、クラスの非静的メンバー関数内からメンバーにアクセスしようとしているという前提で行われています。「外部」から if にアクセスするには、同じトリックを他のポインター (または参照) に適用できsome_pointer->Base::memberます((Base *) some_pointer)->member。
データ メンバーの場合、これら 2 つのアプローチは同等です。メンバー関数の場合、仮想関数では異なる結果になる可能性があります。このため、一般に、最初のアプローチが優先されます。
はい。
f()呼び出しをクラス名で修飾します: SpecificClass::f()。
を前に付けることによりclassname::。