2 重寫
3 重定義
4 重載重定義與重寫
過載指的是在同乙個作用域內,兩函式的函式名可以相同,但是引數不能完全相同,可以是引數型別不同或者是引數個數不同,至於返回值,不影響過載。
//1、函式過載從底層上來說,還是兩個不同的函式!
//函式會被編譯成_test_int_int
inttest
(int a,
int b)
//a//函式會被編譯成_test_int_double
inttest
(int a,
double b)
//b//2、返回值型別不同不可以構成過載
void
test
(int a,
int b)
//c 會報錯,與a函式相同
intmain()
重寫指的在繼承關係中,子類中定義了乙個與父類極其相似的虛函式。
具體怎麼相似:函式名必須相同,引數列表必須相同,返回值可以不相同,但是必須是父子關係的指標或引用。
通過重寫,可以實現動態多型,如果去掉父類的虛函式的virtual,則構不成多型,如果去掉子類虛函式的virtual可以構成多型,可以理解為編譯器優化。
重定義也叫隱藏,指的是在繼承關係中,子類實現了乙個和父類名字一樣的函式,(只關注函式名,和引數與返回值無關)這樣的話子類的函式就把父類的同名函式隱藏了。
a)如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。
b)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有vitual關鍵字,此時,基類的函式被隱藏。(如果有virtual就成重寫了)
下面的**有點繞,不過理解了,你就通透了
#include
using
namespace std;
class
base
void
show()
public
:void
exec()
void
fun(string s)
void
fun(
int a)
//overload:兩個fun函式在base類的內部被【過載】
virtual
intfunction()
};class
classa
:public base
//override:基類中display為虛函式,且引數列表一直,故此處為【重寫】
void
fun(
int a,
int b)
//redefining:fun函式在base類中不為虛函式,故此處為重【重定義】
void
show()
//redefining:理由同上
//子類會偷偷繼承父類的方法哦!
intfunction
(int a)
//overload:注意這是過載而不是重寫,因為引數列表不同,在編譯時classa中其實還有個編譯器自己偷偷加上的從base繼承來的int function(){};};
intmain()
C 過載重寫重定義
includeusing namespace std 函式過載 必須在同乙個類中進行 子類無法過載父類的函式,父類同名函式將被名稱覆蓋 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 必須發生於父類和子類之間 並且父類和子類中的函式必須有完全相同的原型 使用virtual宣告之後能夠產生多...
C 過載 重寫 重定義
指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 是指派生類重新定義基類的虛函式,特徵是 1 不在同乙個作用域 分別位於派生類與基類 2 函式名字相同...
C 過載 重寫 重定義
一 過載 overload 指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 二 重寫 也稱為覆蓋 override 是指派生類重新定義基類的虛函式,...