C++ Primer 5th笔记(chap 15 OOP)继承之类型转换

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

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/114254265