2010-08-02 3 views
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 является подклассом А.

+4

Нет, B не является подклассом A. Это было бы, если вы использовали публичное наследование. – 2010-08-02 14:07:00

+0

[Здесь] (http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance-in-c/1372858#1372858) объясняет, как это работает. –

+0

Почему? Частное наследование означает, что все унаследованные поля и методы станут частными, поэтому они будут доступны только в производном классе. – l245c4l

ответ

3

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

B не имеет доступа к защищенным полям любых других несвязанных объектов в одном дереве наследования.

Apple не имеет права доступа к внутренностям оранжевого цвета, даже если они оба являются плодами.

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); 
} 
+0

Так что это значит, что половина объяснений в Интернете ошибочна? Потому что они говорят, что подкласс имеет доступ к защищенным членам суперкласса, который не соответствует действительности. У него есть доступ к ним, потому что у них все в порядке? Таким образом, защита означает, что они могут быть скопированы в подкласс таким же, как и общедоступным, но не могут быть доступны извне класса. Это верно? – l245c4l

+0

Ваш ответ правильный, но вам не нужен класс apple вообще. (Как вы говорите, компилятор жалуется на защищенный доступ в классе Orange). Просто скажите: оранжевый цвет не может изменить внутренности другого фрукта - даже если он также оранжевый. – IanH

+1

Оранжевый может получить доступ к защищенным внутренним элементам другого Оранжевого *, если видит его как Оранжевый *. - Да, в примере, если 'evil_function' был передан экземпляр Orange, а не Apple, это все равно будет ошибкой компиляции, потому что нет никакой гарантии, что апельсины будут передаваться всегда.Если 'evil_function' принял« Orange & », а вместо« Fruit & », было бы законно изменять защищенный член аргумента. – UncleBens

3

this-> protectedfield: B enherits А, это означает, что protectedfield это свойство само по себе сейчас, так что он может получить к нему доступ.

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

+0

Защищенный означает доступ из A и подкласса A. И B является подклассом A. – l245c4l

+0

@ l245c4l: B не является подклассом A, поскольку вы используете личное, а не публичное наследование. «Наследование» означает «is-a», средство частного наследования «реализовано-в-условиях». – TheJuice

+1

Общественное/частное наследство - это красное слуховое служение. Не существует никаких прав доступа к каждому объекту, каждый объект предоставляет публичный интерфейс другим объектам (независимо от того, какой класс). Дружба - единственный способ подорвать спецификаторы доступа. Примечание: класс X является другом. –

0

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

#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 наследует класс А как частное

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

Спасибо!

 Смежные вопросы

  • Нет связанных вопросов^_^