重載與重寫其實沒有關系,只是在使用過程中,由於某些函數的命名的問題不注意,讓我們產生了不計其數的bug
當位於同一個作用域中的兩個或者更多個函數名字相同但是參數數目不同,或者數目相同但參數類型不一樣的函數相互之間就會發生重載。即函數在調用的時候,會按照參數列表優先選擇最匹配的函數進行調用;—— 這樣就形成了,同一個函數名稱(操作方法),按照其傳進的參數不同(原料不同), 得到不同的函數的調用(結果不同)——這就是重載
重寫:當派生類函數和基類的虛函數含有相同名字和參數列表的時候,基類調用的時候,調用的是基類的虛函數,子類調用的時候調用的是子類的虛函數,發生重寫,(此處的調用指的是指針或者引用的調用,因為只有這樣才會有動態行為綁定)——這樣就是重寫,同一個函數名稱(操作方法),由類層次結構中,不同的類來執行(執行操作的人不同),導致了不同的函數的調用(結果不同)——這就是重寫。——這個實現的是:在基類約定的接口不變的情況下,通過子類實現虛函數改變具體類的具體實現。
舉例:
1: class Base
2: {
3: public:
4: //...
5: virtual int f ( int );
6: void f( Base *);
7: };
8:
9: class D:: public Base
10: {
11: public:
12: //...
13: int f(int );
14: int f( B *);
15: };
在上面的例子中,可以看出
D::f( int ) 與 基類的Base::f( int ) 形成重寫會有動態綁定。 此時D::f( int ) 與 D::f( B *) 之間形成重載關系。
Base::f( int ) 與 Base::f(Base*) 兩者之間形成重載關系,
注意,這裡類的設計者有一個糾結的關系,就是D::f( int ) 與 基類的Base::f( int ) 他們是相互重寫的,代碼能夠動態調用綁定,類層次結構中調用會有不同的效果,但是,又分別於同層次的函數發生重載,不得不說這是一個很蹩腳的設計。