1

重複の可能性:
アクセス指定子とは? プライベート、プロテクト、またはパブリックで継承する必要がありますか?

次のように、プロパティとメソッドのアクセス指定子を保持する派生クラスを C++ で作成するにはどうすればよいですか。

class Base
{
private:
    void base_private();

protected:
    void base_protected();

public:
    void base_public();
};

class A: [what type is appropriate here?] Base
{
public:
    void test() {
        base_protected(); // Ok
    }
};

class B: [what type is appropriate here?] A
{
public:
    void test() {
        base_protected(); // Ok
    }
};

int main()
{
    A a;
    B b;

    a.base_public();        // Ok
    a.base_protected();     // Not Ok
    b.base_protected();     // Not Ok
    b.test();               // Ok

    return 0;
}

つまり、base_protected()メソッドは派生クラスで保護されていますが、base_public()パブリックです。

4

2 に答える 2

2

のメンバーの可用性を考えてみましょうBase:

  • base_privateクライアントは利用できませんが、Baseそれ自体は利用できます
  • base_protectedクライアントは利用できませんが、Baseそれ自体は利用できます
  • base_publicクライアントとBase

現在、class A : public Base(公開継承) がある場合、メンバーの可用性は次のBaseようになります。

  • base_privateクライアントは利用できず、それ自体も利用できませんA
  • base_protectedクライアントは利用できませんが、Aそれ自体は利用できます
  • base_publicクライアントとA

さて、あなたが求めているのは、両方のクラスで同じクライアント インターフェイスを維持する方法BaseですA。上記のリストのクライアントのメンバーの可用性を見ると、Baseand A:base_privateが使用できない場合とまったく同じであることがわかります。base_protected利用できません; 利用base_public可能です。

Baseと の間で変更された唯一の点はAAにプライベートなメンバーにアクセスできないことBaseです。protectedこれがアクセス制御の要点です。これにより、派生クラスは、クライアントが利用できるようにすることなく、基底クラスのメンバーにアクセスできるようになります。

したがって、public継承が必要です。

于 2012-12-29T14:25:02.857 に答える
0

派生クラスは、 を継承するか、を継承するかに関係なく、基底クラスpublicprotectedメンバーにアクセスできます。privateprotectedpublic

継承するprivateと、基本クラスのすべてのメンバーが のprivate派生クラスと見なされAます。継承についても同様でprotected、 の派生クラスはAアクセス可能protectedであり、publicのメンバーですBase

どちらの場合も、private継承の場合でもprotected、のメンバーはBase「パブリック」にはアクセスできません。

あなたの質問に答えるために、public継承を使用して基本クラスのアクセス指定子を保持します。

于 2012-12-29T14:23:54.793 に答える