赋值兼容规则永远不变,父类指针既可以指向父类对象,也可以指向子类对象;当父类指针指向父类对象时,访问父类的成员;当父类指针指向子类对象时,那么只能访问子类中从父类继承下来的那部分成员;不能访问子类独有的成员,如果访问,编译阶段会报错;
函数隐藏(将父类的成员隐藏,通过子类对象或者在子类内部只能访问子类的同名成员;但是父类的成员仍然存在),是指当子类中有和父类同名的成员变量时,此时子类中有两个名字相同的成员变量;那么如果此时我们用父类指针指向子类对象,来访问父子类中名字相同的成员变量时,由于赋值兼容规则,此时绝对访问的是继承来的父类的同名成员变量,但是,如果我们在子类内部或者用子类的对象在子类外部访问此同名成员,此时编译器会将父类的成员隐藏,子类对象访问到的是自己类中重新定义的成员;对于成员函数来说,只要构成了隐藏机制,访问效果也一样;
多态是指;当子类中重写了父类的虚函数,那么通过父类的指针或者引用指向父类对象或着子类对象;用该父类指针或者引用调用父子中被重写的函数;就会有父类指针指向父类对象,调用的是父类中的虚函数;父类指针指向的是子类对象,调用的是子类虚函数;此时,也符合赋值兼容规则;不贵父类的指针或者引用指向父类对象或者子类对象;这个父类指针或者引用都只能访问父类的部分,
当指向父类的对象时,由于本身是父类指针;且父类对象模型中的虚函数表指针所指向的虚函数表中只存放父类的虚函数地址;所以父类的指针调用的重写虚函数时父类的虚函数;
但是当父类指针指向子类对象时,此时子类对象中的父类的虚函数表指针所指的虚函数表中的父类重写虚函数的地址被改写为子类的重写虚函数的地址,所以此时父类指针访问子类中父类的虚函数表时,找到的要调用的同名虚函数是子类的同名虚函数地址;所以父类指针调用子类的重写的同名虚函数;