c 切勿重新定義繼承來的帶預設引數的函式

2022-05-21 15:27:59 字數 496 閱讀 5154

切勿重新定義繼承來的帶預設引數的函式。我們知道,繼承來的函式是virtual 的,至於原因在上一節中已經說明了,即「切勿重新定義父類non-virtual函式」。所以確切的描述應該是「切勿重新定義繼承來的帶預設引數的virtual函式」。因為預設引數是靜態繫結,而virtual是動態繫結。

typedef enum

_colorenumcolorenum;

class

baseoption

;void

baseoption::function(colorenum color)

class

suboption :

public

baseoption

;void

suboption::function(colorenum color)

intmain()

output:

"suboption::function() 2

"

不要重新定義繼承來的非虛函式

effective c item 36 class b class d public b 對於這個繼承體系,有這樣的 d x b pb x pb foo test b d pd x pd foo test d驚訝的發現,兩個語句的行為不一樣.兩者所呼叫的函式相同,物件也相同,因此行為也應該相同 但是...

條款38 絕對不要重新定義繼承而來的預設引數值

1,首先可以安全的把問題討論侷限於 繼承乙個帶有預設引數的虛函式 那麼理由非常直接明了 虛函式系動態繫結,而預設引數卻是靜態繫結.例項 include include using namespace std enum shapecolor a class for geometric shapes c...

條款37 絕不要重新定義繼承而來的預設引數值

總結 不要重新定義乙個繼承而來的預設引數值,因為 預設引數值是靜態繫結 而virtual函式 你唯一應該覆寫的東西 是動態繫結。我們應該知道,virtual函式是動態繫結 dynamically bound 預設引數值卻是靜態繫結 statically bound 物件的靜態型別 static ty...