派生类到基类:
调用函数时:
将派生类对象传递给希望接受基类引用的函数,此时并不发生派生类到基类的类型转化。因为引用直接绑定到派生类上,对象并没有复制,只是将派生类的基类部分的地址传递给基类型的引用。
将派生类对象传递给接受基类对象(并非它的引用)的函数时,形参类型是固定的,只是用派生类对象中的基类部分初始化或赋值基类对象。
初始化赋值时:
对基类进行初始化或者赋值,实际上是在调用构造函数和赋值操作符。用派生类初始化基类时理论上有两种可能:
1.基类定义了形参为派生类的构造函数和赋值操作符(虽然这种情况几乎不可能)。此时的初始化和赋值操作由这些函数决定。
2.基类显示或者隐式的定义了自己的构造函数和赋值函数,这些函数的形参一般都是基类。此时,存在派生类引用到基类引用的转化。
派生类“切掉”为基类经历了以下几个步骤:
1.派生类转化为基类引用,仅仅意味着一个基类的引用绑定到了派生类对象上、
2.该引用作为实参传递给复制构造函数或者赋值构造函数
3.这些操作符使用派生类的基类部分掉用基类的构造函数和赋值操作符。
4.一旦操作执行完毕,对象就是基类的了
基类到派生类:
基类到派生类的自动转化是不存在的。需要派生类时不能使用基类对象,因为基类对象不包括派生类成员。
甚至,当指向基类的指针绑定到派生类时,也不能用这个这个指针给指向派生类的指针赋值。编译器通过静态类型来判断转化是否合法,如果你确定转化是安全的,那么可以通过强制类型转化。