[英]What is the difference between polymorphism and overloading?
我理解多態性並且模糊地理解重載,但是會理解那些完全理解有兩個概念的人來解釋分類差異是什么以及重載是否是多態的形式(似乎對此有不同意見)。
多態性的核心是多個事物,它們都具有一定的一致性行為,這樣您就可以在特定的算法或過程中替換另一個。 只要它們都提供了預期的接口,該過程仍然有效。
重載並沒有真正有這樣的基礎。 它只是能夠為兩個或多個具有相同名稱的函數命名,只要它們具有不同的參數列表即可。 編譯器根據您傳遞的參數類型確定您實際使用的函數。
現在重載可用於創建多態。 考慮以下:
template<typename T>
void func(T t) {call(t);}
這將調用call
,將t
作為參數傳遞。 只要你提供一個類型為T
, call(t)
是合法的C ++代碼,這就行了。 您可以通過使用func
函數call
來執行此操作,無論您感興趣使用func
:
void call(int);
void call(float);
void call(vector<int>);
以這種方式, func
是一個相對於其參數是多態(靜態)的函數。 它可以對任何類型執行操作,只要該類型具有適當的接口即可。 該接口能夠使用該類型的變量調用函數call
。
func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal
在這里,我們使用函數重載call
來通過func
函數創建一種形式的多態性。 但這並不意味着重載是多態的。
重載是一種語言工具。 多態性是一個概念。 多態性是指使多個對象以相同的方式工作。 重載只是賦予不同功能相同名稱的一種方法。
多態性:一種方法,具有多個實現,具體取決於調用它的參數的類型。 通常在編譯時不知道。 參數的數量是固定的,而在C ++中,唯一的類型重要的參數是第一個( this
)。 在C ++中,它的通用版本需要具有virtual
方法的基類。
重載:一個名稱實際上是多個方法,具體取決於調用它的參數的計數和類型。 始終在編譯時決定。 不涉及基類。
如果你想要一個類比:多態性就是當你雇用十幾個專業技師來do_work(vehicle)
,他們每個人都有do_work(vehicle)
和take_vacation(duration)
。 每個人都做了不同的事情,但他們都有相同的簽名,除了C ++中的“隱含的這個”論點(在Python中也稱為self
)等。 重載是指你雇用通才技師,每個人都有do_work(steering)
, do_work(lighting)
, do_work(engine)
等。
重載是多態的一個子集。 多態性有兩種類型:運行時和編譯時。 重載屬於后者( 編譯時/靜態多態的一些其他方面以及模板 , 函數指針 )
通常作者提到多態性的一個在運行時( 指定除外 )完成,如果你正在談論的多態性,那么顯然是一個在運行時進行( 約翰的回答已經在他的回答引起了基本差異WRT 繼承/虛函數有 )和重載是在當你的函數參數確定編譯時間,這超載被稱為完成。
重載 - 靜態多態 (演示)
以下截圖可以演示函數重載是如何靜態的( 在運行時解析 )
PS
萬一,您希望看到,這是一個關於重載和虛函數的相關問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.