在同乙個作用域中,兩個函式的函式名相同,引數個數,引數型別,引數順序至少有乙個不同,函式返回值的型別可以相同,也可以不相同。
c++中支援函式過載是因為c++中會對函式進行名字修飾。name mangling是一種在編譯過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱。
c語言只是簡單的在函式名前新增下劃線。因此當工程中存在相同函式名的函式時,就會產生衝突。所以c語言不支援函式過載。
函式過載**:
int
add(
int left,
int right)
double
add(
double left,
double right)
long
add(
long left,
long right)
intmain()
這裡的add(10, 20);
會去呼叫int add(int left, int right)
函式。
這裡的add(10.0, 20.0);
會去呼叫double add(double left, double right)
函式。
這裡的add(10l, 20l);
會去呼叫long add(long left, long right)
函式。
重定義(也叫做隱藏)是指在繼承體系中,子類重新定義父類中有相同名稱的非虛函式 ( 引數列表可以不同 ) ,此時子類的函式會遮蔽掉父類的那個同名函式。
如果想要呼叫父類的那個成員函式必須要加上父類的域作用限定符。
重定義規則如下:
如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。
如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式被隱藏(如果相同有virtual就是重寫覆蓋了)。
重定義**
這裡的a是指向父類物件的父類指標,因此呼叫show函式時,調的是父類的show函式。
b是指向子類物件的子類指標,因此呼叫show函式時,此時父類和子類的show函式構成了重定義,因此子類物件去呼叫的時候會遮蔽掉父類的同名函式,因此調的是子類物件的show函式。
c是指向子類物件的父類指標,指標的型別是父類指標,不是多型看型別,因此呼叫的是父類的show函式。
重寫(也叫做覆蓋)是指在繼承體系中子類定義了和父類函式名,函式引數,函式返回值完全相同的虛函式。此時構成多型,根據物件去呼叫對應的函式。
重寫需要注意:
被重寫的函式不能是static的。必須是virtual的
重寫函式必須有相同的型別,名稱和引數列表
重寫函式的訪問修飾符可以不同。儘管virtual是private的,派生類中重寫改寫為public,protected也是可以的
重寫**
這裡的show函式都是虛函式,並且函式引數返回值都相同,所以構成重寫,構成多型。所以是多型看物件,那麼這裡的a指向的是子類的物件,因此a->show();
列印出來的是子類的show函式。
print函式返回值型別不同,不構成多型,也不滿足協變,因此報錯。
fun函式的引數不同,所以雖然是虛函式但是也不構成重寫,這裡構成了隱藏。因此a->fun();
中,不是多型看型別,所以調的是父類的fun函式,b->fun(1);
中,b指向的是子類的物件,因此會自動遮蔽掉父類的同名函式去調子類的fun函式。
C 函式過載 重寫與重定義
程式1 方法的過載 class a a int getmax int a,int b 1 double getmax int a,int b 2 double getmax double a,double b 3 上面的程式中,方法1和方法3是函式的過載 引數列表不同 但是方法2不是,因為與方法1比...
c 重寫重載重定義
include 34 includeusing namespace std 過載 重寫 重定義 重寫發生在兩個類之間 父類和子類 過載必須發生在乙個類之間 引數列表 重寫分為兩類 1.虛函式重寫 前面加上virtual關鍵字,會發生多型2.非虛函式重寫 重定義 class parent virtua...
C 函式重定義 過載 重寫
c 的重寫,過載,重定義 1.重寫 override 又稱覆蓋 父類與子類之間的多型性。子類重新定義父類中有相同名稱和引數的虛函式。1 被重寫的函式不能是 static 的。必須是 virtual 的,或者是 override 的 即函式在最原始的基類中被宣告為 virtual c 中沒有 over...