1、由於絕不重新定義繼承而來的non-virtual方法,現只考慮帶有預設引數值的virtual方法。
2、為什麼絕不重新定義繼承而來的預設引數值?
預設引數值是靜態繫結,virtual方法是動態繫結。現在考慮父類virtual方法帶有預設引數值,子類重寫了virtual方法,父類指標指向子類物件,呼叫virtual方法,導致的結果是:用父類的預設引數值初始化形參,呼叫子類重寫的方法實現。這肯定不是程式設計師預期的結果。
3、怎麼解決這個問題?
使用nvi,父類通過non-virtual方法呼叫virtual方法,父類non-virtual方法使用預設引數值,父類virtrual方法不使用預設引數值,並且是private。子類重寫private方法。
4、注意:private virtual方法也是可以重寫的,子類的虛方法表中,會進行替換。private virtual方法的影響是:子類不能訪問父類的private virtual 方法,父類指標也不能訪問自己的private virtual 方法。
條款37 絕不重新定義繼承而來的預設引數值
條款37 絕不重新定義繼承而來的預設引數值 靜態繫結就是在程式中被宣告時所採用的型別 includeusing namespace std class shape virtual void draw shapecolor color red const 0 class rectangle publi...
條款37 絕不重新定義繼承而來的預設引數值
乙個用於描述幾何形狀的class class shape 所有形狀都必須提供乙個函式,繪出自己 virtual void draw shapecolor color red const 0 class rectangle public shape class circle public shape ...
條款37 絕不要重新定義繼承而來的預設引數值
總結 不要重新定義乙個繼承而來的預設引數值,因為 預設引數值是靜態繫結 而virtual函式 你唯一應該覆寫的東西 是動態繫結。我們應該知道,virtual函式是動態繫結 dynamically bound 預設引數值卻是靜態繫結 statically bound 物件的靜態型別 static ty...