http://en.cppreference.com/w/cpp/language/accessによると、
保護されたメンバーは、クラスとそのメソッド内、およびその子孫でアクセスできます
子孫の子孫ではなく、直接の子孫のみを意味するのか、それともすべての子孫を意味するのか?
たとえば、クラス C が B のサブクラスであり、B が保護されたメンバーを持つ A のサブクラスである場合、B は明らかにそれにアクセスできますが、C はどうでしょうか?
http://en.cppreference.com/w/cpp/language/accessによると、
保護されたメンバーは、クラスとそのメソッド内、およびその子孫でアクセスできます
子孫の子孫ではなく、直接の子孫のみを意味するのか、それともすべての子孫を意味するのか?
たとえば、クラス C が B のサブクラスであり、B が保護されたメンバーを持つ A のサブクラスである場合、B は明らかにそれにアクセスできますが、C はどうでしょうか?
保護されたメンバーは、プライベート継承が使用されるまで/到達しない限り、すべての子孫で利用できます。したがって、A、B、および C がすべてパブリック継承 (または保護された継承、ほとんど無視するほどまれですが) を使用している限り、はい、最も派生したクラスは、最も基本的なクラスの保護されたメンバーを引き続き使用できます (およびD、E、および F があった場合、同じことが当てはまります)。
すべての子孫。
また、時々自分で試してみてください。どこかに main.cpp を作成して試してみてください。それが一番勉強になります。
(もちろん、他に指定していないので、ここでは公開派生をずっと使用していると仮定しています)
幸運を
直系の子孫だけということですか?
いいえ - 子孫の子孫、子孫の子孫の子孫なども対象となります。それらはすべて、継承のチェーンのずっと上にある、すべての基本クラスの保護されたメンバーにアクセスできます。
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
ます。
保護されたメソッドは、最初の子孫で保護またはプライベートのいずれかになります (子孫がどのように継承されたかによって異なります)。そこから、それらのステータスは、継承規則に従ってそのクラスのメンバーであるかのように決定されます。
例:
class A{
protected: int var;
}
class B : private A{
}
class C : protected A{
}
class D : public A{
}
In C
and D
variablevar
は保護されておりB
、非公開であり、それ以上の子孫からは見ることができません。