转换与继承
基类类型对象可以作为独立对象存在,也可以作为派生类对象一部分存在。所以,基类对象,可以是,也可以不是一个派生类对象的一部分。所以没有从基类引用/指针到派生类引用/指针的自动转换。
派生类到基类的转换
如果有一个派生类对象,可以使用它的地址对基类类型的指针进行赋值或初始化。对于引用类型同样适用。这个过程没有对对象的类型转换。而且可以使用派生类型对象对基类型对象赋值或初始化。
可以将派生类型的对象传给希望接受基类引用的函数。此过程中对象也没用转换。将对象传递给希望接受引用的函数时,引用直接绑定到对象上,但实际上实参是该对象的引用。对象本身并未复制。而且该对象仍为派生类类型。
将派生类型的对象传给希望接受基类类型的函数时,形参类型固定。编译时,运行时,形参都是基类类型对象。如果传递给这种函数派生类型对象,则将会复制基类类型部分。
由此可见,引用,指针 的静态类型和动态类型可以不同。(用词可能不准确)
派生类对象对基类对象进行赋值或初始化
对基类的赋值,实际上是调用赋值操作符,初始化,实际上是调用拷贝构造函数。
下面是一个例子。
基类类型名 基类对象名 (派生类对象名)//派生类对象已经初始化。
实现过程:将派生类对象转化为基类引用。仅仅意味着将一个基类引用绑定到派生类对象上。将引用作为实参传递给赋值操作符或拷贝构造函数。使用派生类对象的基类部分,对基类对象赋值或初始化。
基类到派生类的转换
不要期待自动转换。不能将派生类的指针,引用绑定到基类上,也不能用基类对象对派生类对象初始化或赋值。(如果试图用基类对派生类赋值、初始化,可能会导致派生类访问不存在的成员。)
当基类的指针或引用实际绑定到派生类对象上时,从基类到派生类的转换也存在限制。
当基类的指针绑定到派生类对象上时,(指针的动态类型是派生类,静态类型是基类)不能使用该指针对派生类指针 初始化,赋值。(can’t convert base to derived)原因是编译器在编译时无法知道特定的转换在运行时实际上是安全的。编译器确定转换是否合法,只看指针或引用的静态类型。