綁定例外
一般指針和引用和要綁定的對象屬於同種類型,但基類指針或引用的綁定是一個例外。
靜態類型和動態類型
靜態類型編譯時就確定,動態類型是運行時查對象內存才知道。
靜態類型是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&)