>>256 >>224 の B は 「Aの派生クラス」 であって、A ではないよね。
だから A のインスタンスの protected メンバにはアクセスできない。
でも B の別のインスタンスの
(A から継承した) protected メンバにはアクセスできるから、
下のようにすればコンパイルは通る。
class A {
protected:
int xxx;
};
class B : public A {
public:
void func(B* ptr); // B へのポインタを受け取るようにする。
};
void B::func(B* ptr) {
cout << ptr->xxx;
}
>>264 Aを抽象クラスとして、Aに対して処理することに意味がある場合は?
例えば、CompositパターンのCompositオブジェクトから
基底クラスのprotectedへアクセスしたい場合とか。
同じ派生クラス型の異なるインスタンス間においては、相手のインスタンス
のリファレンスやポインタを受け取ることによって、相手のすべてのメンバ
(派生クラスのメンバ)にアクセスできるし、相手の基底クラス
のprotectedメンバ以下(protectedとpublic)のメンバにもアクセスでき
る。ただし、一方が派生クラスのインスタンスで、他方がその基底クラスの
インスタンスである場合、派生クラス側が基底クラス側のインスタンスの
リファレンスやポインタを受けとっても、その基底クラスのprotectedメンバ
以上(protectedとprivate)のメンバにはアクセスできない。
>>224 でエラーが出たのは、派生クラスが基底クラスのポインタを受けとって
いたから、protectedメンバにアクセスできなかったということで、
もし派生クラスのインスタンスを受け取るように設計してれ
ば、インスタンスが異なっていても基底クラスのprotectedメンバにアクセス
できるということ。