绝不重新定义继承而来的缺省值参数
生活随笔
收集整理的這篇文章主要介紹了
绝不重新定义继承而来的缺省值参数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
絕不重新定義繼承而來(lái)的缺省值參數(shù)
文章目錄
- 絕不重新定義繼承而來(lái)的缺省值參數(shù)
- 一、問(wèn)題引入
- 二、結(jié)論
一、問(wèn)題引入
- 在C++中,只能繼承兩種函數(shù):虛(virtual)函數(shù)和非虛(non-virtual)函數(shù)。
- 而重新定義一個(gè)繼承而來(lái)的帶有缺省參數(shù)值的虛(virtual)函數(shù)永遠(yuǎn)是錯(cuò)誤的
- 虛(virtual)函數(shù)是動(dòng)態(tài)綁定
- 缺省參數(shù)值是靜態(tài)綁定
以上代碼有個(gè)問(wèn)題,如果你用下面的調(diào)用方式:
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)!!!!- 我們會(huì)發(fā)現(xiàn),pr的動(dòng)態(tài)類型是Rectangle*, 所以調(diào)用的是Rectangle的virtual函數(shù),Rectangle::draw的缺省參數(shù)應(yīng)該是GREEN
- 但是,由于pr的靜態(tài)類型是Shape*,所以此調(diào)用的缺省參數(shù)值來(lái)自Shape而不是Rectangle。
- C++之所以這么做,是考慮到運(yùn)行時(shí)效率的問(wèn)題。如果缺省參數(shù)值是動(dòng)態(tài)綁定,編譯器就必須在運(yùn)行期為虛函數(shù)決定適當(dāng)?shù)娜笔≈怠_@比目前實(shí)行的“在編譯器決定”機(jī)制更慢更復(fù)雜。
二、結(jié)論
- 絕對(duì)不要重新定義一個(gè)繼承而來(lái)的缺省參數(shù)值,這些參數(shù)值都是靜態(tài)的,而虛函數(shù)卻是動(dòng)態(tài)的。
- 這段代碼的輸出結(jié)果是999而非666,也就充分驗(yàn)證我們的結(jié)論
總結(jié)
以上是生活随笔為你收集整理的绝不重新定义继承而来的缺省值参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机基础- -计算机为什么要使用二进制
- 下一篇: 计算机基础- -认识磁盘