C++ 赋值兼容规则
派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。
1.派生类对象 可以赋值给 基类的对象
A a1; //定义基类A对象a1
B b1; //定义类A的公用派生类B的对象b1
a1=b1; //用派生类B对象b1对基类对象a1赋值
- 在赋值时舍弃派生类自己的成员,只进行数据成员的赋值。
- 实际上,所谓赋值只是对数据成员赋值,对成员函数不存在赋值问题,内存中数据成员和成员函数是分开的。
- 请注意: 赋值后不能企图通过对象a1去访问派生类对象b1的成员,因为b1的成员与a1的成员是不同的。
- 只能用子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值,理由是显然的,两种对象的大小是不同的,因为基类对象不包含派生类的成员,无法对派生类的成员赋值。同理,同一基类的不同派生类对象之间也不能赋值。
2.派生类对象 可以赋值给 基类的引用
A a1; //定义基类A对象a1
B b1; //定义公用派生类B对象b1
A& r1=a1; //定义基类A对象的引用变量r1(A的别名是r),并用a1对其初始化这时,r和a1共享同一段存储单元。也可以用派生类对象初始化引用变量r,将上面最后一行改为
A& r2=b1;//定义基类A对象的引用变量r2,并用派生类B对象b1//对其初始化
- 引用的底层实现就是指针,因此引用同理指针
- 此时r2并不是b1的别名,也不与b1共享同一段存储单元。它只是b1中基类部分的别名(个人认为这里的r定义为A类的引用,所以它的有效范围就只有A类那么大)
如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象。如有一函数fun():
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>