публичный, охраняемый, частный - PullRequest
3 голосов
/ 02 августа 2010

Посмотрите на этот код:

#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 имеет доступ к этому-> защищенному полю, но не имеет доступа к защищенному полю. Зачем? Тем не менее, B является подклассом A.

Ответы [ 3 ]

3 голосов
/ 02 августа 2010

B имеет доступ только к самим защищенным полям или другим объектам типа B (или, возможно, полученным из B, если он видит их как B-s).

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);
}
3 голосов
/ 02 августа 2010

this-> protectedfield: B наследует A, это означает, что защищенное поле теперь является собственностью самого себя, поэтому оно может получить к нему доступ.

a.protectedfield: a является членом класса B, этот член имеет переменную защищенного поля, которая защищена.B не может коснуться этого, потому что защищенный означает только доступ изнутри.

0 голосов
/ 11 июня 2013

Позволяет разбить весь код на маленькие части. Скопируйте и вставьте эти два кода и попробуйте скомпилировать !!!!

#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!!!!
}

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...