5

メンバーにプライベートを継承させたい。私はそれらを公開する例を見たと思いますが、この事実はprivateキーワードで派生しています。私の質問: それを行う方法と、可能であれば禁止すべきではありませんか?

class U{
public:
    int a;
protected:
    int b;
private:
    int c;
};

class V : private U{
public:
    int i;
    //can make a public again?
};
4

3 に答える 3

6

プライベートでアクセスできないため、c公開することはできません(さらに、カプセル化に違反するため、それを必要とする設計にはおそらく欠陥があります-クラスは他のクラスのメンバーを認識/気にするべきではありません)。UVprivate

ただし、宣言によって派生クラスによってアクセス レベルをオーバーライドできるprotectedandpublicメンバーについては、同じことは当てはまりません。例えば:using

class V : private U{
public:
    int i;

    using U::a;
//  ^^^^^^^^^^^ Gives "a" public accessibility 

    using U::b;
//  ^^^^^^^^^^^ Gives "b" public accessibility

    // using U::c; // ERROR! c is not accessible from V

};

上記により、 and のb外部のクライアント コードからアクセスできるようにVなりUます。

int main()
{
    V v;
    v.a = 42; // OK
    v.b = 1729; // OK
}
于 2013-05-04T15:02:05.193 に答える
5

どうやってするの?

完全に可能usingです。キーワードを使用してください。

禁止すべきではないか。

必要なし。いつでもメンバーのアクセシビリティを元に戻すことができますが、最初よりも多くはできません。したがって、基本クラスが最初に何かをパブリックとして宣言し、それをプライベートにするのがあなたのアイデア/制限であった場合、この制限を削除してこれをパブリックのままにしても、基本クラスに害はありません。始まり。「C++ プログラミング言語」から引用すると、ここで最も役立ちます。

using 宣言を使用して追加 情報にアクセスすることはできません。これは、アクセシブルな情報をより使いやすくするための単なるメカニズムです。

したがって、基本クラスでアクセス可能であり、protectedまたはキーワードを使用してクラスを派生させた場合、この制限を削除し、派生クラス定義のprivate適切な部分 ( ) にそれらを「転送」することで、最初のレベルのアクセスに戻すことができます。public,protected,private

class U{
public:
    int a;
protected:
    int b;
private:
    int c;
};

class V : private U{
public:
    using U::b;
    using U::a;
};

int main(int argc, char** argv) {

    V v;
    printf("\nV: %d %d %d",v.a,v.a,v.b);

    U u;
    printf("\nU: %d %d %d",u.a,u.a,u.a);

    return 0;
}
于 2013-05-04T15:02:56.057 に答える
3

U::cの公開なので公開できません。からはアクセスできません。またはの場合は、宣言を使用して実行できます。したがって、作成して公開することはできますが、次のことはできません。privateUVpublicprotectedusingU::aU::bU::c

class V : private U{
public:
    int i;
    //can make c public again?
    using U::c; // ERROR: only if U::c is public or protected in U
    using U::a; // OK
    using U::b; // OK
};
于 2013-05-04T15:03:03.353 に答える