過載和重寫的區別

2021-09-20 06:16:26 字數 1128 閱讀 1476

一:過載

過載指的是在同乙個作用域內,兩函式的函式名可以相同,但是引數不能完全相同,可以是引數型別不同或者是引數個數不同,至於返回值,不影響過載

如下,構成了過載:

void test(int a, int b)

void test(double x, double y)

c++如何實現過載?

c++**在編譯時會根據引數列表對函式進行重新命名,例如void test(int a, int b)會被重新命名為_test_int_int,void test(int x, double y)會被重新命名為_test_int_double。所以說函式過載從底層上看它們還是不同的函式

二:重定義

重定義也叫隱藏,指的是在繼承關係中,子類實現了乙個和父類名字一樣的函式,(只關注函式名,和引數與返回值無關)這樣的話子類的函式就把父類的同名函式隱藏了。 

舉個例子,下面程式的執行結果為:

class a

public:

int _x;

};class b : public a

public:

int _x;

};void test1()

很明顯,子類隱藏了父類的f函式,這個題目比較迷惑人的是子類的f函式有引數,所以會以為調的是父類的f函式; 

但是隱藏只與函式名有關,與引數是沒關係的,所以呼叫的還是子類的f函式,所以輸出  b。

三:重寫

重寫指的在繼承關係中,子類中定義了乙個與父類極其相似的虛函式。 

具體怎麼相似:函式名必須相同,引數列表必須相同,返回值可以不相同,但是必須是父子關係的指標或引用。

通過重寫,可以實現動態多型,何為動態多型,就是當父類的指標或引用指向被重寫的虛函式時,父類的指標或引用指向誰就呼叫誰的虛函式,而不是說根據型別。 

在這裡,如果去掉父類的虛函式的virtual,則構不成多型,如果去掉子類虛函式的virtual可以構成多型,可以理解為編譯器優化。

過載和重寫區別

區別就是 過載 只在自己內部類 繼承的時候通過變換返回引數型別和引數個數來實現的 或者只在乙個類中的話,就是通過構造方法的引數不同來進行過載 左邊的是重寫,右邊的是過載 右邊子類的方法和父類的方法是完全兩個方法,因為引數變了 重寫 子類和父類之間 是子類實現父類同名方法,而且方法內部的引數型別要一模...

重寫和過載區別

當子類繼承父類的方法,這些方法不滿足自身需求時,子類可以重寫從父類繼承的方法。重寫的規則 修飾符 返回型別 方法名 引數 public void skill package jicheng public class dog extends anima package jicheng 子類 publi...

重寫和過載的區別

過載是指同乙個類中有若干個名稱相同但引數不同的方法。呼叫方法時,系統會根據實參情況,呼叫引數完全匹配的那個方法。重寫是指在繼承關係中,在派生類中重寫由基類繼承來的方法,這時基類和派生類中就有兩個同名的方法。系統根據物件的 實際型別呼叫相應版本的方法,當物件型別為基類時,系統呼叫基類中的方法。當物件型...