C 函式過載 重定義與重寫

2021-09-21 13:14:27 字數 2412 閱讀 4853

在同乙個作用域中,兩個函式的函式名相同,引數個數,引數型別,引數順序至少有乙個不同,函式返回值的型別可以相同,也可以不相同。

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...