C 過載 重寫 重定義

2021-10-25 06:03:22 字數 1559 閱讀 7103

指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。

(1)相同的範圍(在同乙個作用域中) ;

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無。

(5)返回值可以不同;

是指派生類重新定義基類的虛函式,特徵是:

(1)不在同乙個作用域(分別位於派生類與基類) ;

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有 virtual 關鍵字,不能有 static 。

(5)返回值相同(或是協變),否則報錯;<—-協變這個概念我也是第一次才知道…

(6)重寫函式的訪問修飾符可以不同。儘管 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的

注意:覆蓋不是刪除了基類原來的函式,本身是一直存在的,只是呼叫的時候,優先呼叫子類的同名函式(只要子類有了這個函式,就不會去父類找,即使引數個數,型別不一樣)。如果要呼叫基類的,可以通過域作用符,指定呼叫。

(1)不在同乙個作用域(分別位於派生類與基類) ;

(2)函式名字相同;

(3)返回值可以不同;

(4)引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載以及覆蓋混淆) 。

(5)引數相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆) 。

#include

#include

using

namespace std;

class

base

// overload the base::a(int) function

virtual

voida(

double x)

virtual

voidb(

int x)

voidc(

int x)};

class

derived

:public base

// override the base::b(int) function

voidb(

int x)

// redefine the base::c() function

voidc(

int x)};

intmain()

通過這裡可以看出:

1.base類中的第二個函式a是對第乙個的過載

2.derived類中的函式b是對base類中函式b的重寫,即使用了虛函式特性。

3.derived類中的函式a是對base淚中函式a的隱藏,即重定義了。

4.pb指標是乙個指向base型別的指標,但是它實際指向了乙個derived的空間,這裡對pd呼叫函式的處理(多型性)取決於是否重寫(虛函式特性)了函式,若沒有,則依然呼叫基類。

5.只有在通過基類指標或基類引用 間接指向派生類型別時多型性才會起作用。

6.因為base類的函式c沒有定義為virtual虛函式,所以derived類的函式c是對base::c()的重定義。

C 過載重寫重定義

includeusing namespace std 函式過載 必須在同乙個類中進行 子類無法過載父類的函式,父類同名函式將被名稱覆蓋 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 必須發生於父類和子類之間 並且父類和子類中的函式必須有完全相同的原型 使用virtual宣告之後能夠產生多...

C 過載 重寫 重定義

一 過載 overload 指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 二 重寫 也稱為覆蓋 override 是指派生類重新定義基類的虛函式,...

過載重寫重定義

傳智掃地僧課程學習筆記。過載發生了同乙個類中,這個很簡單,不用多說,重寫和重定義,發生了兩個類之間,有virtual關鍵字的,將發生多型,即重寫,沒有的,是重定義,說2個情況,1,若是子類呼叫父類中的函式,並且這個函式名,是名字,在子類中沒有,那麼子類物件可以直接呼叫父類的函式,2,若是這個被呼叫的...