>なぜ、上のではダメだったのかが少し気になりました。
protectedはそういう仕様なのだと思います。
感覚的には「参照規制緩和版」privateという感じです。
規制緩和対象になる為の条件が
「派生クラスコード内における、その派生クラスインスタンス」
な訳です。
この為、BクラスインスタンスのA::protectedメンバは 条件に合致する為、参照OKに
なります。
一方、AクラスインスタンスのA::protectedメンバは 条件に合致しない為、参照NGに
なります。
こんな感じです。
みなさん、お返事、ありがとうございました。
初めの書き込みで、間違えてm_dataをBクラスに記述してしまったので、とてもわかりにくい説
明になってしまっいました。すみません。
私は、dairygoodさんが言うように、
>普通「protectedメンバはそのクラスと派生クラスからアクセス可能」
ということはすべて
>「クラスAを継承すると、Aのm_dataにアクセスできるようになる」
と考えていました。こう宣言すれば、Aのm_dataメンバがどちらのクラスのメンバか一切意識せ
ずに使えると思っていました。でも、実際は、関数のインターフェイスの書式では、引数として
持たせる場合、基本クラスの型ではなく、派生クラスの型を宣言しなくてはいけませんでした。
全く同じように使えるはずなのに、どうしてここでは、派生クラスの型として宣言しなくてはい
けないのだろう、ということがわからなかったところです。
ですが、dairygoodさんの指摘するように、確かに、基本クラスの型を宣言できると、親子関係
にない別のクラスのprotected関数をも呼び出せてしまうのですね。だいぶ納得しました。よ
く、コンストラクタをオーバーロードしているクラスからクラスを派生することがよくあるので
すが、これからは、これらに気をつけていけそうです。ありがとうございました。