Managerクラスがありその機能は一部のクラスにしか利用できないって設計の場合
一部のクラスをfriendする以外に何か方法はありませんか?
Managerのメソッドをprotectedにしておけば、
メソッド呼び出しはManagerの導出クラスに限定されます。
# お奨めしません。
お勧めしない理由を教えてください
クラス構造上リーズナブルでない状態になる可能性があるからでは?
本来はクラスの機能としてリーズナブルな形での派生をするべきなのに
protectedの関数を呼び出したいという目的だけで派生するケースが
出てきそうなので。
> お勧めしない理由を教えてください
導出するだけで使えるようになるんじゃ
制限の意味がありません。
素直にfriendするのが上策です。
ありがとうございました。
実は継承よりfriendの方が妥当な理由が知りたかったのです。
> 継承よりfriendの方が妥当な理由
「明らか」じゃありませんか?
Managerとその他のクラスの作ってる人が違えば
friendでないと、勝手にManagerを継承されて
簡単に使えてしまえますのでfriendの方が妥当な事はわかりました。
勝手に継承、も問題ですが、PATIOさんの書いた
> protectedの関数を呼び出したいという目的だけで派生するケース
これが起こると目も当てられませんね。
例えば、クラスAとBとで共通のManagerのインスタンスを使いたいがために、
Manager m; // A, B共通で使うManagerのインスタンス
class A: public Manager {
...
void Managerを使う関数その1() {
m.何か(); // あれ? A自身が持つManagerサブオブジェクトは?
}
...
};
class B: public Manager {
...
void Managerを使う関数その2() {
m.何か(); // だからB自身のManagerサブオブジェクトは?
}
...
};
なんてことをしてしまうと、無駄なサブオブジェクトはできるわ、継承の概念を
根底からぶち壊すやらで、もはや何が何やら。
# 実際にこんなコードを見て戦慄したことがあります。正気なくすかと思った……
こんなのを考えていました。
class Manager
{
protected:
Manager(){}
void something(){}
void something2(){}
};
class A:public Manager
{
public:
void usedManager(){ something(); }
};
class B:public Manager
{
public:
void usedManager(){ something2(); }
};
> こんなのを考えていました。
表示されているコードに問題はありません。
something()が何をするかによっては問題があります。
よくある例でCarクラスからTruckクラスが派生しているのがありますよね?
人が車を使いたいからといって、class Driver : public Carにするのは間違いです。
chさんのManagerとAとの関係がCarとTruckの関係だと思いますか?
CarとDriverの関係だと思いますか?
Driver以外の人には運転させたくない、という目的のために、
継承を使うのが誤りなのです。