1. 派生类->基类(编译器隐式执行)
1.1 将基类的指针或引用绑定到派生类的对象上:当使用基类的引用或指针时,实际上我们并不清楚该引用或指针所绑定对象的真实类型。该对象可能是基类的对象,也可能是派生类的对象。
Quote item; // 基类对象
Bulk_quote bulk; // 派生类对象
Quote *p = &item; // p指向基类 Quote 对象
p = &bulk; // p指向派生类 Bulk_quote 对象的基类部分
Quote &r = bulk; // r绑定到派生类 Bulk_quote 对象的基类部分
1.2. 派生类对象中含有与其基类对应的组成部分,所以能把派生类的对象当成基类对象使用
//当我们初始化或赋值一个类类型的对象时,实际上是调用构造函数或赋值运算符
Bulk_quote bulk;
Quote item(bulk) ; //调用Qutoe的构造函数
item = bulk; //调用Qutoe的operator=
切割sliced down:当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分将被忽略掉。
- 和任何其他成员一样,派生类向基类的类型转换也可能会由于访问受限而变得不可行。
- 智能指针也支持派生类向基类的类型转换
2. 基类->派生类
不存在基类对象向派生类对象的隐式类型转换,但是当编译器无法确定某个特定的转换在运行时是否安全的时候,则可以,但这是很危险的
Bulk_quote bulk;
Bulk_quote *bulkP=itemP; //错误,不能将基类转换成派生类
如果在基类中含有一个或多个虚函数,可以使用 dynamic_cast 来请求一个类型转换,该转换的安全检查将在运行时执行,同样。如果已知某个基类向派生类转换是安全的,则可以使用 static_cast 来强制覆盖掉编译器的检查工作。
【引用】
[1] 代码oopTest.h