前提:公用派生类完整地继承了基类的功能,使基类与派生类对象之间有赋值兼容关系。(赋值不考虑成员函数)
对于:
class A{}
class B{}
A a1,*pa1;
B b1,*pb1;
合法访问:a1=b1;
A &aa=b1;//aa引用的是b1中继承自基类的成员
pa1=&b1;//pa1能访问到的也只能是b1中继承自基类的成员
非法访问:
b1=a1;//派生类b1中自己的数据成员在a1中是没有的,因此无法赋值
B &bb=a1;
pb1=&a1;
基类对象不能赋值给派生类对象。
(1)派生类对象向基类对象赋值
在赋值时,要舍弃派生类自己的成员;
赋值只是对数据成员赋值,对成员函数不存在赋值问题;
赋值后不能企图通过对象a1去访问派生类对象b1中自己的成员。
(2)派生类对象替代基类对象
派生类对象替代基类对象可以向基类对象的引用进行赋值或初始化。
(3)子类对象当实参传递给基类形参(传值/传地址/引用)
在函数中只能访问派生类中继承自基类成员的值。
函数的参数是基类对象或者基类对象的引用或者是指向基类对象的指针,相应的实参可以用派生类的对象(如果形参为指针,则实参为派生类对象的地址)。
(4)指向基类对象的指针变量也可以指向派生类对象
对于上面的程序来说,pt->display()执行的并不是grad1也就是Graduate类中的display函数,否则的话就还会输出pay。因此它执行的是派生类中继承自基类中的display函数。