ライブラリの実際の設計を見ずに判断するのは難しいですが、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_ _ _ _ _derivedderivedbasebasederived
この制限は、他のいくつかのユースケースでは少し明確ではなく、直接単純な方法ではなく、自分の階層の外にある保護されたメンバーへのアクセスを取得できる可能性があります (私は、言語)。
一方、上記のコードderivedのフレンドである場合は、サブオブジェクトであるかどうかに関係なく、どこにでもあるすべてのインスタンスへのアクセスが許可baseされるため、コンパイルされます。derivedbasederived
下位タイプへ
protectedアクセス指定子は推移的です。派生型へのアクセスを許可すると、そこから派生するすべての型と、直接継承する可能性のある他の型にアクセスを許可することprotectedになります。アクセスを許可するタイプと許可しないタイプを制御することは不可能です。一方、友情は正確であり、友人として宣言された型のメンバーのみがアクセスできます。フレンドシップは推移的ではないため、宣言されたフレンド以外のタイプはアクセスできます。