c 虛函式與預設實參

2021-07-03 20:01:34 字數 729 閱讀 5059

c++ primer 中原文:

像其他任何函式一樣,虛函式也可以有預設實參。 通常, 如果有用在給定呼叫中的預設實參值, 該值在編譯時確定。如果乙個呼叫省略了具有預設值的實參, 則所用的值由呼叫該函式的型別定義, 與物件的動態型別無關

。 通過基類的引用或指標呼叫虛函式時, 預設實參為在基類虛函式宣告中指定的值, 如果通過派生類的指標或引用呼叫虛函式, 則預設實參是在派生類的版本中宣告的值。 

在同一虛函式的基類版本和派生類版本中使用不同的預設實參幾乎一定會引起麻煩。如果通過基類的引用或指標呼叫虛函式, 但實際執行的是派生類中定義的版本,這時就可能會出現問題。 在這種情況下, 為虛函式的基類版本定義的預設實參將傳給派生類定義的版本, 而派生類版本是用不同的預設實參定義的。

#include using namespace std;

class a

結果如下:

第二行並不是我們想要的結果, 我們期望的輸出應該是b: 1。 這也印證了 

如果乙個呼叫省略了具有預設值的實參, 則所用的值由呼叫該函式的型別定義, 與物件的動態型別無關這句話。  

effective  條款37 中提到  :  virtual 函式是動態繫結, 而預設引數值卻是靜態繫結。

請記住:  絕對不要重新定義乙個繼承而來的預設引數值, 因為預設引數值都是靜態繫結, 而virtual函式 --你唯一應該覆寫的東西----卻是動態繫結。

虛函式與預設實參

include using namespace std 2013.9.5 c primer p482 虛函式也可以有預設實參。如果有用在給定呼叫中的預設實參值,該值將在編譯時確定。如果乙個呼叫省略了具有預設值的實參,則所用的值由呼叫該函式的型別定義,與物件的動態型別無關。通過基類的引用或指標呼叫虛函...

虛函式中的預設實參

c premier 先看例子吧 include iostream using namespace std class base class derived public base public int foo int ival 2048 cout cout cout 我是初學c 用編譯器執行突然發現...

關於虛函式的預設實參的問題

a.h class a a.cpp void a log int a,int b,int c const std endl b.h include a.h class b public a b.cpp void b log int a,int b,int c const std endl main....