1

私はかなり前に(現在は離れている)同僚によって書かれたC ++コードを調べていたところ、解読しようとしている奇妙なクラス定義を見つけました。

class BaseClass
{
    friend SubClass1;
    friend SubClass2;
}

class SubClass1 : public BaseClass
{
    ...
}

class SubClass2 : public BaseClass
{
    ...
}

この方法でクラス階層を設計することには利点がありますか?サブクラスからBaseClassのプライベートメソッドにアクセスしたい場合は、プライベートではなく保護されたメソッドに移動しませんか?ここに欠けているイディオムがあるように感じます。

4

5 に答える 5

8

ライブラリの実際の設計を見ずに判断するのは難しいですが、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になります。アクセスを許可するタイプと許可しないタイプを制御することは不可能です。一方、友情は正確であり、友人として宣言された型のメンバーのみがアクセスできます。フレンドシップは推移的ではないため、宣言されたフレンド以外のタイプはアクセスできます。

于 2012-04-24T18:05:58.617 に答える
7

私はそれを含む特定のイディオムを知りませんが、簡単な答えは、彼らがプライベートメンバーを多くのサブクラスのうちのいくつかのサブクラスにのみ公開したいと思ったということかもしれません。あるいは、保護されたメンバーの概念を単純に理解していない可能性があります。

于 2012-04-24T17:29:59.760 に答える
4

イディオムについてはわかりませんが、1 つの可能性は、他のサブクラスがあることです。このように、友達はアクセスできますが、他のサブクラスはアクセスできません。

于 2012-04-24T17:31:36.390 に答える
1

サンプル コードでは、サブクラスを a にする必要はありませんfriendprotectedおっしゃる通り、サブクラスからアクセスする必要のあるメンバーは作ったほうがいいです。それ以外の場合は、コードの匂いです。

ただし、基本クラスの時点でサブクラスを作成する必要がある場合が 1 つあります。(Javafriendのように)を作成したいときです。そのコーナーケースを説明するfinal classサンプルコードを次に示します。

于 2012-04-24T17:32:56.793 に答える
0

プログラミングが貧弱だと思います。あなたが実際にそのような定義から利益を得ることができるどんな場合も本当に考えることができません。

于 2012-04-24T17:30:12.847 に答える