Q:

Parent accessing child

I understand everything what is stated here, it describes how Child accesses Parent members. But, how about Parent Accessing Child? I just can't understand this. Why it is wrong? Could you please explain in terms of static binding rules during compile time? Here Student class itself becomes protected I guess, but why?
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 error:

Error is: type cast: conversion from 'Student*' to 'Person*' exists, but is inaccessible

A:

Its not about how Person "sees" Student, its about what access control on inheritance means. 
When you say class Student: public Person, it means you are announcing that a Student is a Person to everyone, that means main() knows a Student* can be referred to by a Person*. So all is good.
When you say class Student: private Person, it means Student is inheriting functionality from Person, but that is simply an implementation detail. This doesn't let anyone know a Student is a Person so it can't be considered as one. Therefore main() thinks Student* and Person* are unrelated. 
When you say class Student: protected Person, its a little bit trickier but the process still applies. You are inheriting the functionality from Person and any derived class of Student also knows that. So if you had a class like Freshman that inherited from Student, it'd know it was also a Person. However, that is specific to the inherited classes, main() doesn't know Student is a Person because that knowledge is protected. 

