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