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

2021-08-30 16:25:00 字數 542 閱讀 6557

1,首先可以安全的把問題討論侷限於"繼承乙個帶有預設引數的虛函式"

那麼理由非常直接明了:

虛函式系動態繫結,而預設引數卻是靜態繫結.

例項**:

#include

#include

using namespace std;

enum shapecolor ;

// a class for geometric shapes

class shape

};class rectangle: public shape

};int main()

注意:pb2 -> draw(); //基類預設

當你呼叫乙個定義在derived class內的虛函式時,卻使用基類為它指定的預設引數值.

2,c++為啥要堅持這麼運作捏?

答案:又是執行時的效率.

如果預設引數也是動態繫結,編譯器就必須通過某種辦法在執行時期為虛函式決定適當的預設引數值.這樣的機制更慢更複雜.

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

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

條款37 決不要重新定義繼承而來的非虛函式

class b class d public b 甚至對b,d或mf一無所知,也可以定義乙個型別d的物件x,d x x是型別d的乙個物件 那麼,如果發現這麼做 b pb x 得到x的指標 pb mf 通過指標呼叫mf 和下面這麼做的執行行為不一樣 d pd x 得到x的指標 pd mf 通過指標呼叫...

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

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驚訝的發現,兩個語句的行為不一樣.兩者所呼叫的函式相同,物件也相同,因此行為也應該相同 但是...