Родитель, имеющий доступ к ребенку - PullRequest
0 голосов
/ 08 мая 2018

Я понимаю все, что указано здесь , оно описывает, как Child обращается к родительским элементам. Но как насчет доступа родителей к ребенку? Я просто не могу этого понять. Почему это неправильно? Не могли бы вы объяснить с точки зрения правил статического связывания во время компиляции? Здесь сам ученический класс становится защищенным, я думаю, но почему?

using namespace std;
class Person
{
public:
    int b;  
};

class Student : protected Person
{
public:
    int c;
};

int main()
{
    Student s;
    Person *pPerson;
    pPerson = &s;
    return 0;
}

C-T ошибка:

Ошибка: приведение типа: преобразование из «Ученик *» в «Персона *» существует, но недоступно

1 Ответ

0 голосов
/ 08 мая 2018

Речь не о том, как Person «видит» Student, а о том, что контроль доступа по наследованию означает .

Когда вы говорите class Student: public Person, это означает, что вы объявляете, что Student - это Person для всех, это означает, что main() знает, что Student* может указываться Person*. Так что все хорошо.

Когда вы говорите class Student: private Person, это означает, что Student наследует функциональность от Person, но это просто деталь реализации. Это не позволяет никому знать, что Student - это Person, поэтому его нельзя рассматривать как единое целое. Поэтому main() считает, что Student* и Person* не связаны.

Когда вы говорите class Student: protected Person, это немного сложнее, но процесс все еще применяется. Вы наследуете функциональность от Person, и любой производный класс Student также знает это. Поэтому, если бы у вас был класс, подобный Freshman, который унаследовал от Student, он бы знал, что это также Person. Однако, это специфично для унаследованных классов, main() не знает, Student - это Person, потому что это знание защищено.

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