绝不重新定义继承而来的缺省值参数
生活随笔
收集整理的這篇文章主要介紹了
绝不重新定义继承而来的缺省值参数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
絕不重新定義繼承而來的缺省值參數
文章目錄
- 絕不重新定義繼承而來的缺省值參數
- 一、問題引入
- 二、結論
一、問題引入
- 在C++中,只能繼承兩種函數:虛(virtual)函數和非虛(non-virtual)函數。
- 而重新定義一個繼承而來的帶有缺省參數值的虛(virtual)函數永遠是錯誤的
- 虛(virtual)函數是動態綁定
- 缺省參數值是靜態綁定
以上代碼有個問題,如果你用下面的調用方式:
Shape *ps; Shape *pc = new Circle; Shape *pr = new Rectangle;pc->draw(Shape::Red); //Circle::draw(Shape::Red); pr->draw(Shape::Red); //Rectangle::draw(Shape::Red);pr->draw(); //Rectangle::(Shape::Red)!!!!- 我們會發現,pr的動態類型是Rectangle*, 所以調用的是Rectangle的virtual函數,Rectangle::draw的缺省參數應該是GREEN
- 但是,由于pr的靜態類型是Shape*,所以此調用的缺省參數值來自Shape而不是Rectangle。
- C++之所以這么做,是考慮到運行時效率的問題。如果缺省參數值是動態綁定,編譯器就必須在運行期為虛函數決定適當的缺省值。這比目前實行的“在編譯器決定”機制更慢更復雜。
二、結論
- 絕對不要重新定義一個繼承而來的缺省參數值,這些參數值都是靜態的,而虛函數卻是動態的。
- 這段代碼的輸出結果是999而非666,也就充分驗證我們的結論
總結
以上是生活随笔為你收集整理的绝不重新定义继承而来的缺省值参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机基础- -计算机为什么要使用二进制
- 下一篇: 计算机基础- -认识磁盘