最近在網上看到好多人都說 多態 和 重載 是一個東西, 但是根據我多年的知識積累總覺得不對,便在網上找到了一些網友的觀點,記錄如下:
多態是基於對抽象方法的覆蓋來實現的,用統一的對外接口來完成不同的功能。重載也是用統一的對外接口
來完成不同的功能。那么兩者有什么區別呢?
重載,是指允許存在多個同名方法,而這些方法的參數不同。重載的實現是:編譯器根據方法不同的參數表
,對同名方法的名稱做修飾。對於編譯器而言,這些同名方法就成了不同的方法。它們的調用地址在編譯期
就綁定了。
(
java 的重載是可以包括父類和子類的, 即子類可以重載父類的 同名 不同參數 的方法, 子類可以繼承父類的重載
C++, 子類中若有同名函數則隱藏父類的其他同名函數,即子類如果有同名函數則不能繼承父類的重載。
重載,是在編譯階段 便已確定具體的代碼。對同名不同參數的 方法的調用。
)
多態:是指子類重新定義父類的虛方法(virtual,abstract)。當子類重新定義了父類的虛方法后,父類根據
賦給它的不同的子類,動態調用屬於子類的該方法,這樣的方法調用在編譯期間是無法確定的。
不難看出,兩者的區別在於編譯器何時去尋找所要調用的具體方法:
對於重載而言,在方法調用之前,編譯器就已經確定了所要調用的方法,這稱為“早綁定”或“靜態綁定”;
(
重載,是指在一個類中的 同名不同參數的 函數調用。C++ 中繼承的時候存在隱藏,java中不存在。
重載、覆蓋 是繼承中的概念。
)
而對於多態,只有等到方法調用的那一刻,編譯器才會確定所要調用的具體方法,這稱為“晚綁定”或“動態綁定”。
以下引至:http://blog.csdn.net/chenguolinblog/article/details/27314745
重載和覆蓋的區別
1. 重載要求函數名相同,但是參數列表必須不同,返回值可以相同也可以不同。
覆蓋要求函數名、參數列表、返回值必須相同。
2. 在類中重載是同一個類中不同成員函數之間的關系
在類中覆蓋則是子類和基類之間不同成員函數之間的關系
3. 重載函數的調用是根據參數列表來決定調用哪一個函數
覆蓋函數的調用是根據對象類型的不同決定調用哪一個
4. 在類中對成員函數重載是不能夠實現多態
在子類中對基類虛函數的覆蓋可以實現多態
