基类和子类的类型转换

绑定例外

一般指针和引用和要绑定的对象属于同种类型,但基类指针或引用的绑定是一个例外。

静态类型和动态类型

静态类型编译时就确定,动态类型是运行时查对象内存才知道。

静态类型是Quote&,动态类型是运行时调用函数才知道。

一致情况

如果形参不是引用或指针,那么静态类型和动态类型一致


类型转换

基类向派生类直接转是不行的

Quote base;
Bulk_quote *bulkP = &base;  //xxx
Bulk_quote &bulkRef = base; //xxx

间接也不行 

Bulk_quote bulk;
Quote *itemP = &bulk;

Bulk_quote *bulkP = itemP; //xxx 

解释:这两种写法直接检查静态类型,一看不合适就报错。dynamic_cast会运行时帮忙检查,而如果确定没问题可以在编译时用static_cast强制转。

如果函数不是虚函数,那么都会调用静态类型的版本,就是基类的

调用基类版本会忽略掉子类的自己多定义的部分。

Bulk_quote bulk;
Quote item(bulk);  //调用Quote::Quote(const Quote&)

item = bulk; //调用Quote::operator =(const Quote&)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章