一、過載(overload)
指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。
(1)相同的範圍(在同乙個作用域中) ;
(2)函式名字相同;
(3)引數不同;
(4)virtual 關鍵字可有可無。
(5)返回值可以不同;
二、重寫(也稱為覆蓋 override)
是指派生類重新定義基類的虛函式,特徵是:
(1)不在同乙個作用域(分別位於派生類與基類) ;
(2)函式名字相同;
(3)引數相同;
(4)基類函式必須有 virtual 關鍵字,不能有 static 。
(5)返回值相同(或是協變),否則報錯;<—-協變這個概念我也是第一次才知道…
(6)重寫函式的訪問修飾符可以不同。儘管 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的
三、重定義(也成隱藏)
(1)不在同乙個作用域(分別位於派生類與基類) ;
(2)函式名字相同;
(3)返回值可以不同;
(4)引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載以及覆蓋混淆) 。
(5)引數相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆) 。
#include #includeusing
namespace
std;
class
base
//overload the base::a(int) function
virtual
void a(double x)
virtual
void b(int x)
void c(int x)
};class derived : public
base
//override the base::b(int) function
void b(int x)
//redefine the base::c() function
void c(int x)
};int
main()
通過這裡可以看出:
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 過載 重寫 重定義
指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 是指派生類重新定義基類的虛函式,特徵是 1 不在同乙個作用域 分別位於派生類與基類 2 函式名字相同...
過載重寫重定義
傳智掃地僧課程學習筆記。過載發生了同乙個類中,這個很簡單,不用多說,重寫和重定義,發生了兩個類之間,有virtual關鍵字的,將發生多型,即重寫,沒有的,是重定義,說2個情況,1,若是子類呼叫父類中的函式,並且這個函式名,是名字,在子類中沒有,那麼子類物件可以直接呼叫父類的函式,2,若是這個被呼叫的...