绑定例外
一般指针和引用和要绑定的对象属于同种类型,但基类指针或引用的绑定是一个例外。
静态类型和动态类型
静态类型编译时就确定,动态类型是运行时查对象内存才知道。
静态类型是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&)