1

http://en.cppreference.com/w/cpp/language/accessによると、

保護されたメンバーは、クラスとそのメソッド内、およびその子孫でアクセスできます

子孫の子孫ではなく、直接の子孫のみを意味するのか、それともすべての子孫を意味するか?

たとえば、クラス C が B のサブクラスであり、B が保護されたメンバーを持つ A のサブクラスである場合、B は明らかにそれにアクセスできますが、C はどうでしょうか?

4

4 に答える 4

6

保護されたメンバーは、プライベート継承が使用されるまで/到達しない限り、すべての子孫で利用できます。したがって、A、B、および C がすべてパブリック継承 (または保護された継承、ほとんど無視するほどまれですが) を使用している限り、はい、最も派生したクラスは、最も基本的なクラスの保護されたメンバーを引き続き使用できます (およびD、E、および F があった場合、同じことが当てはまります)。

于 2012-12-20T21:29:36.377 に答える
3

すべての子孫。

また、時々自分で試してみてください。どこかに main.cpp を作成して試してみてください。それが一番勉強になります。

(もちろん、他に指定していないので、ここでは公開派​​生をずっと使用していると仮定しています)

幸運を

于 2012-12-20T21:29:41.260 に答える
1

直系の子孫だけということですか?

いいえ - 子孫の子孫、子孫の子孫の子孫なども対象となります。それらはすべて、継承のチェーンのずっと上にある、すべての基本クラスの保護されたメンバーにアクセスできます。

class A {
protected:
    int val;
public:
    A(int x) : val(x) {}
};

struct B : public A {
    B(int x) : A(x) {}
};

struct C : public B {
    C(int x) : B(x) {}
    void show() {
        cout << val << endl;
    }
};

int main() {
    C c(123);
    c.show();
    return 0;
}

上記はコンパイルして出力し123ます。

于 2012-12-20T21:28:45.677 に答える
1

保護されたメソッドは、最初の子孫で保護またはプライベートのいずれかになります (子孫がどのように継承されたかによって異なります)。そこから、それらのステータスは、継承規則に従ってそのクラスのメンバーであるかのように決定されます。

例:

class A{
   protected: int var;
}

class B : private A{
}

class C : protected A{
}

class D : public A{
}

In Cand Dvariablevarは保護されておりB、非公開であり、それ以上の子孫からは見ることができません。

于 2012-12-20T21:29:47.413 に答える