この回答ではpublic
、コードで継承を使用したと仮定します(これは質問にはありませんでした)。
[C++11: 11.2/1]:
public
クラスがアクセス指定子を使用して別のクラスの基本クラスとして宣言されている場合 (条項 10)public
、基本クラスのメンバーpublic
は派生クラスのメンバーとしてアクセス可能であり、基本クラスのメンバーは派生クラスのメンバーprotected
としてアクセス可能protected
です。 . protected
アクセス指定子を使用してクラスが別のクラスの基底クラスとして宣言されている場合、基底クラスのpublic
およびメンバーは、派生クラスのメンバーprotected
としてアクセスできます。protected
アクセス指定子を使用してクラスが別のクラスの基底クラスとして宣言されている場合、基底クラスprivate
の public およびメンバーは、派生クラスのメンバーprotected
としてアクセスできます。private
これは、同じオブジェクトのメンバーにアクセスしている場合をカバーしています。
ただし、別のオブジェクトのメンバーprotected
にアクセスするには、同じ型またはより派生した型の定義内に配置する必要があるというのは、メンバー アクセスのちょっとした好奇心です。あなたの場合、それはより少ない派生型(つまり、ベース)にあります:protected
[C++11: 11.4/1]:
非静的データ メンバーまたは非静的メンバー関数がその名前付けクラスの保護されたメンバーである場合、条項 11 で前述したものを超える追加のアクセス チェックが適用されます (11.2)。前述のように、保護されたメンバーへのアクセスは、参照は、一部のクラスのフレンドまたはメンバーで発生しC
ます。アクセスがメンバーへのポインターを形成することである場合 (5.3.1)、nested-name-specifierC
はまたは から派生したクラスを示すものとしC
ます。他のすべてのアクセスには、(おそらく暗黙の) オブジェクト式 (5.2.5) が含まれます。この場合、オブジェクト式のクラスはC
または から派生したクラスでなければなりませんC
。
つまり、Class1
メンバー関数内からこのコードを実行する必要があります。
Bjarne は、彼の著書The C++ Programming Language (Sp. Ed.)の 404 ページでこれについて言及しています。
派生クラスは、独自の型のオブジェクトに対してのみ、基本クラスの保護されたメンバーにアクセスできます [...] これにより、1 つの派生クラスが他の派生クラスに属するデータを破損したときに発生する微妙なエラーを防ぐことができます。