天天看點

重載(overload)和重寫(overried,有的書也叫做“覆寫”)的差別?

從定義上來說:  

重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。  

重寫:是指子類重新定義父類虛函數的方法。

 從實作原理上來說:  重載:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對于編譯器來說是這樣的)。如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。對于這兩個函數的調用,在編譯器間就已經确定了,是靜态的。也就是說,它們的位址在編譯期就綁定了(早綁定),是以,重載和多态無關!  

重寫:和多态真正相關。當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動态的調用屬于子類的該函數,這樣的函數調用在編譯期間是無法确定的(調用的子類的虛函數的位址無法給出)。是以,這樣的函數位址是在運作期綁定的(晚綁定)。