C 之過載與覆蓋

2021-07-11 05:15:45 字數 2811 閱讀 5783

overload:

過載指的是同乙個類

中有兩個或多個名字相同但是引數不同

的方法,(注:返回值不能區別函式是否過載),過載沒有關鍵字。

override:

重寫是指子類對父類中虛函式或抽象函式

的「覆蓋」(這也就是有些書將過載翻譯為覆蓋的原因),但是這種「覆蓋」和用new關鍵字來覆蓋是有區別的。

new:

覆蓋指的是不同類中(基類或派生類)有兩個或多個返回型別、方法名、引數都相同,但是方法體不同的方法。

但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏

,被覆蓋的父類方法是可以呼叫得到的。

過載覆蓋的發生條件:

過載,必然發生在乙個類中,函式名相同,引數型別或者順序不同構成過載,與返回型別無關

重寫,必然發生在基類和派生類中,其類函式用virtual修飾,派生類用override修飾

覆蓋,在子類中寫乙個和基類一樣名字(引數不同也算)的非虛函式,會讓基類中的函式被隱藏,編譯後會提示要求使用new關鍵字

過載示例:

public void fun()

public void fun(int i)

",i);

}

override重寫特性:

由 override 宣告重寫的方法稱為重寫基方法,

重寫的基方法必須與 override 方法具有相同的簽名。

重寫的基方法必須是 virtual、abstract 或 override 的

,不能重寫非虛方法或靜態方法

。override的方法和virtual的方法必須具有相同的訪問級別修飾符

,不能更改 virtual 方法的可訪問性

。不能使用new、static 或 virtual 修飾符來修改 override 方法。

重寫屬性宣告必須指定與繼承屬性完全相同的訪問修飾符、型別和名稱,並且被重寫的屬性必須是virtual、abstract 或override 的。

覆蓋示例:

當我們沒有使用覆蓋時,派生類繼承基類,結果如下:

class a

}class program:a

}//結果為:i am f

當我們覆蓋原來的方法呢?

class a

}class program:a

", i);

}static void main(string args)

}//結果為:i am f,i=1

new覆蓋與重寫、過載的區別:

當子類與父類的引數不同時

當基類函式不是虛函式時,基類函式將被隱藏。(因為子類和基類不在同一範圍內,所以不是過載)

當基類函式是虛函式時,基類函式將被隱藏。(

因為子類和基類不在同一範圍內,所以不是過載;因為引數不同,所以不是重寫

)當子類與父類的引數相同時

當基類函式不是虛函式時,基類函式將被隱藏。(

因為子類和基類不在同一範圍內,所以不是過載,

因為基類不是虛函式,所以是隱藏不是重寫)

當基類函式是虛函式時,基類函式將被覆蓋。(

因為子類和基類不在同一範圍內,所以不是過載)

那麼為什麼不是重寫呢?我們可以做乙個例子還測試一下,這個例子在虛函式時已經舉過,在這裡為了說明此問題在重複一下:

class a

}class program:a

", i);

}static void main(string args)

}

我們知道,以上例子中,派生類存在乙個對基類的重寫方法,所以結果為:i am f ,i=1

若是我們把override換成new,那麼如果是重寫的話,會和上面的結果相等,但實際結果是什麼呢?

實際的結果是:i am f

由此我們知道,

當基類函式是虛函式時,基類函式不是重寫,而是覆蓋了基函式的同名函式。

虛函式的動態繫結僅在基類指標或引用繫結派生類物件時發生,所以呼叫哪個版本的函式編譯時就已經確定

對於c++中經常出現的函式名稱相同但是引數列表或者返回值不同的函式,主要存在三種情況:

1.函式重寫(override)

函式過載主要實現了父類與子類之間的多型性,子類中定義與父類中名稱和引數以及返回值都相同的虛函式。

1)重寫的函式不能是static函式,必須是virtual函式,即函式在原始的基類中被宣告為虛函式;

2)重寫函式與基類函式分在兩個類的宣告和定義中,這也就導致二者的作用域不同;

3)重寫函式的名稱、引數列表以及返回值(即函式原型)都要與基類的函式相同;

4)重寫函式的訪問修飾符可以不同,儘管virtual函式是private的,在派生類中重寫的函式可以是public或protect的

2.函式過載(overload)

指函式名稱相同但是引數型別或者引數順序不同的相同作用域中的函式,函式過載不能靠返回值來進行區分;

3.重定義(redefine)

指子類重新定義父類中的非虛函式(引數列表可以不同),這樣父類中的對應函式將被隱藏。

二、重寫(override)與過載(overload)的區別

1、函式重寫是子類和父類之間的繼承關係,是垂直關係;方法的過載是同乙個類中方法之間的關係,是水平關係;

2、重寫需要子類和父類中的兩個函式的函式原型完全相同;過載要求兩個函式引數列表不同;

3、在重寫關係中,呼叫具體呼叫哪乙個函式是根據(物件對應儲存空間的實際型別)為準的,這涉及到動態繫結和靜態繫結的問題,也就是虛函式的呼叫機制,而函式過載主要是靠形參列表的不同來區分具體呼叫哪個函式的。

C 之過載與覆蓋

overload 過載指的是同乙個類中有兩個或多個名字相同但是引數不同的方法,注 返回值不能區別函式是否過載 過載沒有關鍵字。override 過載也稱重寫是指子類對父類中虛函式或抽象函式的 覆蓋 這也就是有些書將過載翻譯為覆蓋的原因 但是這種 覆蓋 和用new關鍵字來覆蓋是有區別的。new 覆蓋指...

c 覆蓋 過載與隱藏

成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 具體分為引數個數不同 引數型別不同 const 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有vi...

過載與覆蓋

過載 方法名相同,引數列表不同 引數型別 引數個數和引數順序不同 覆蓋 1.子修飾符訪問許可權不能比父類修飾符的許可權低 2.被覆蓋的方法 父類方法 不能用final staic private 修飾 覆蓋和過載的不同 方法覆蓋要求引數列表必須一致,而方法過載要求引數列表必須不一致。方法覆蓋要求返回...