指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。
(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,若是這個被呼叫的...