條款38: 決不要重新定義繼承而來的預設引數值
條款38中,明確指出,繼承函式的預設引數不可重新定義。這是因為虛函式和預設引數的繫結方式不同。虛函式為動態繫結,而預設引數靜態繫結。在使用父類指標指向的物件呼叫虛函式時,函式會按實際指向的物件呼叫對應的成員函式(動態繫結的結果),而函式的預設引數依舊為父類物件中的預設引數(靜態繫結的結果)。如下例所示,呼叫的方法不同,而輸出的預設引數值相同。
如此,在程式中,如果虛函式定義了預設引數,那麼,子類中則不必定義(定義了不管用)。
如果父類中的虛函式沒有預設引數,而子類中定義了預設引數呢? 當然 父類指標呼叫使用預設引數的foo是編譯不過的!
當然,如果指向物件的指標不是父類指標,那就各回各家,各找各媽。呼叫本類中定義的函式,同時使用靜態繫結在本類物件中的預設引數。
虛函式的預設引數問題
q include using namespace std class base 乙個表示幾何形狀的類 class shape class rectangle public shape class circle public shape 用圖形來表示是下面這樣 shape rectangle cir...
C 虛函式中的預設引數
注意 虛函式中盡量不要使用預設引數!父類 pragma once class base include base.h base base base base 子類 pragma once include base.h classa public base include a.h include a ...
關於函式預設引數的說法
在網上找到2種說法,第一種預設引數在申明中賦值,第二種預設引數在定義 實現 中賦值。其實不知道哪種說法正確,但我所經歷的情況是二種都可以,以後有時間了再去仔細研究一下,先記下來 六 函式引數的預設值 本講重點概念 c 允許實參個數與形參個數不同。辦法是在形參表列中對乙個或幾個形參指定預設值 或稱預設...