Речь не о том, как 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
, потому что это знание защищено.