3

このコードを見てください:

#include <iostream>

using namespace std;

class A
{
private:
    int privatefield;
protected:
    int protectedfield;
public:
    int publicfield;
};

class B: private A
{
private:
    A a;
public:
    void test()
    {
        cout << this->publicfield << this->protectedfield << endl;
    }
    void test2()
    {
        cout << a.publicfield << a.protectedfield << endl;
    }
};

int main()
{
    B b;
    b.test();
    b.test2();
    return 0;
}

B は this->protectedfield にアクセスできますが、a.protectedfield にはアクセスできません。なんで?しかし、B は A のサブクラスです。

4

3 に答える 3

3

B は、それ自体またはタイプ B の他のオブジェクトの保護されたフィールド (または B と見なされる場合は、B から派生した可能性があります) にのみアクセスできます。

B は、同じ継承ツリー内の他の無関係なオブジェクトの保護フィールドにアクセスできません。

リンゴは、両方が果物であっても、オレンジの内部にアクセスする権利はありません。

class Fruit
{
    protected: int sweetness;
};

class Apple: public Fruit
{
    public: Apple() { this->sweetness = 100; }
};

class Orange: public Fruit
{
public:
    void evil_function(Fruit& f)
    {
        f.sweetness = -100;  //doesn't compile!!
    }
};

int main()
{
    Apple apple;
    Orange orange;
    orange.evil_function(apple);
}
于 2010-08-02T14:14:43.180 に答える
3

this->protectedfield: B は A を継承します。これは、protectedfield が現在それ自体のプロパティであるため、アクセスできることを意味します。

a.protectedfield: a はクラス B のメンバーです。このメンバーには、保護されている protectedfield 変数があります。保護されているとは、内部の A からのアクセスのみを意味するため、B に触れることはできません。

于 2010-08-02T14:09:33.393 に答える
0

コード全体を小さな部分に分けてみましょう。この 2 つのコードをコピーして貼り付け、コンパイルしてみてください!!!!

#include <iostream>
using namespace std;
class A
{
private:
    int privatefield;
protected:
    int protectedfield;
public:
    int publicfield;
};

int main()
{
    A a;
    cout<<a.publicfield;
    cout<<a.privatefield;/////not possible ! private data can not be seen by an object of that class
    cout<<a.protectedfield;////again not possible. protected data is like privete data except it can be inherited by another.If inherited as private then they are private,if as protected then protected and if as public then also protected.
}

B はクラス A をプライベートとして継承するようになりました

#include <iostream>

using namespace std;

class A
{
private:
    int privatefield;
protected:
    int protectedfield;
public:
    int publicfield;
};

class B: private A
{
private:
    A a;
public:
    void test()
    {
        cout << this->publicfield << this->protectedfield << endl;
    }
    void test2()
    {
        cout << a.publicfield << endl;
    }
};
int main()
{
    /*Now B will have both public and protected data as private!!!!
    That means
     B now looks like this class


     Class B
     {  

        private:
        int protectedfield;
        int publicfield;
     }

     As we have discussed private/protected data can not be accessed by object of the class
     so you you can not do things like this

     B b;
     b.protectedfield; or b.publicfield;

     */
    B b;
    b.privatefield;////Error !!!
    b.protectedfield/////error!!!!
}

ありがとう!

于 2013-06-11T11:57:51.377 に答える