ライブラリの実際の設計を見ずに判断するのは難しいですが、2 つのアプローチは同等ではありません。このように使用friend
すると、すべてのメンバーを宣言して取得できるよりも少ない型にアクセスできますprotected
。
アクセスの向上
の意味は、派生型のあらゆる場所のすべての基本メンバーへのアクセスをprotected
正確に許可するのではなく、派生型内の基本サブオブジェクトの保護されたメンバーへのアクセスを許可することです。違いは、派生型は保護されたメンバー、または独自の型または派生型ではない型にアクセスできないことです。
1 つはすべてのメンバーが保護され、フレンド宣言がないクラスの 2 つのバージョンを考えます。もう 1 つは、すべてのメンバーがプライベートで、サブクラスをフレンドとして宣言します。ここで、派生型に関数があるとします。
struct derived : base {
void f( base& b ) {
//std::cout << b.protected_method() << std::endl; // Error
std::cout << protected_method() << std::endl; // Ok, accessing your own base
}
};
. _ protected
_ protected
_ _ _ _ _derived
derived
base
base
derived
この制限は、他のいくつかのユースケースでは少し明確ではなく、直接単純な方法ではなく、自分の階層の外にある保護されたメンバーへのアクセスを取得できる可能性があります (私は、言語)。
一方、上記のコードderived
のフレンドである場合は、サブオブジェクトであるかどうかに関係なく、どこにでもあるすべてのインスタンスへのアクセスが許可base
されるため、コンパイルされます。derived
base
derived
下位タイプへ
protected
アクセス指定子は推移的です。派生型へのアクセスを許可すると、そこから派生するすべての型と、直接継承する可能性のある他の型にアクセスを許可することprotected
になります。アクセスを許可するタイプと許可しないタイプを制御することは不可能です。一方、友情は正確であり、友人として宣言された型のメンバーのみがアクセスできます。フレンドシップは推移的ではないため、宣言されたフレンド以外のタイプはアクセスできます。