C++相談室2

このエントリーをはてなブックマークに追加
>>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;
}
-----------------------------------------------------
<html><head><title>クラスのアクセス</title></head><body>
<table><tr><td>派生の仕方\基本</td><td>Public</td><td>
Protected</td><td>Private</td></tr><tr><td>Public</td><td>
Public</td><td>Protected</td><td>参照不可</td></tr><tr>
<td>Protected</td><td>Protected</td><td>Protected</td><td>
参照不可</td></tr><tr><td>Private</td><td>Private</td><td>
Private</td><td>参照不可</td></tr></table><p>表の中にある
のは、派生した後の派生クラスから見たメンバの状態 </p>
</body></html>
-----------------------------------------------------
HTMLで保存して、見なさい。

(多分あってると思う・・・間違ってたら指摘して)
>>264
Aを抽象クラスとして、Aに対して処理することに意味がある場合は?
例えば、CompositパターンのCompositオブジェクトから
基底クラスのprotectedへアクセスしたい場合とか。
267デフォルトの名無しさん:01/09/11 23:15
同じ派生クラス型の異なるインスタンス間においては、相手のインスタンス
のリファレンスやポインタを受け取ることによって、相手のすべてのメンバ
(派生クラスのメンバ)にアクセスできるし、相手の基底クラス
のprotectedメンバ以下(protectedとpublic)のメンバにもアクセスでき
る。ただし、一方が派生クラスのインスタンスで、他方がその基底クラスの
インスタンスである場合、派生クラス側が基底クラス側のインスタンスの
リファレンスやポインタを受けとっても、その基底クラスのprotectedメンバ
以上(protectedとprivate)のメンバにはアクセスできない。

>>224 でエラーが出たのは、派生クラスが基底クラスのポインタを受けとって
いたから、protectedメンバにアクセスできなかったということで、
もし派生クラスのインスタンスを受け取るように設計してれ
ば、インスタンスが異なっていても基底クラスのprotectedメンバにアクセス
できるということ。