過載:
過載是指在同乙個作用域下,函式的函式名相同,但是函式引數的個數,或者引數的型別,引數的順序不同。這時函式之間就構成了過載關係,這裡需要注意的是,如果函式的引數列表完全相同,僅僅是返回值型別不同並不能構成過載。同乙個作用域又怎麼理解呢?在這裡主要分兩種情況討論,一種是在類外但是函式在同乙個cpp檔案中屬於同乙個作用域,另一種是在類中也屬於同乙個作用域。
函式在類外,但是同在乙個cpp檔案
//函式在類外,但是同在乙個cpp檔案
#include
using
namespace
std;
void test(int i) //
函式1void test(double i) //
與函式1引數個數相同,引數型別不同,構成過載
void test(int i, int j) //
與函式1引數型別相同,但是引數個數不同,構成過載
int test(int i) //
僅返回值型別不同,不能構成過載
函式在類內,這裡有一種情況下也可以構成過載,函式名,引數列表完全相同,但是函式有const關鍵字修飾
//函式在同乙個類中
#include
using
namespace
std;
class
a ~a(){};
void test(int i) //
函式1
void test(double i)//
與函式1引數個數相同,引數型別不同,構成過載
void test(int i, int j)//
與函式1引數型別相同,但是引數個數不同,構成過載
void test(int i) const
//與函式1引數型別引數個數相同,有const 關鍵字修飾,構成過載
};
重寫(覆蓋):
重寫也叫做覆蓋,發生在父類和子類中,當父類中有虛函式時,在子類中重新定義乙個與父類虛函式函式名,函式引數列表一模一樣的函式,並重寫函式的具體實現,此種情況就構成了重寫。
//重寫#include
using
namespace
std;
class
a ~a(){};
virtual
void
test()
};class b :public
a ~b(){}
virtual
void test()//
virtual關鍵字可寫可不寫
};
隱藏:
隱藏也發生在父類和子類中,主要包含兩種情況:
1、子類和父類的函式名,引數型別完全相同,但是父類函式沒有virtual關鍵字修飾
2、子類和父類函式名相同,但是引數列表不同,此時不管有沒有virtual關鍵字修飾,都能構成隱藏
//子類和父類的函式名,引數型別完全相同,但是父類函式沒有virtual關鍵字修飾
#include
using
namespace
std;
class
a ~a(){};
void
test()
};class b :public
a ~b(){}
void
test()
};
//子類和父類函式名相同,但是引數列表不同,此時不管有沒有virtual關鍵字修飾,都能構成隱藏
#include
using
namespace
std;
class
a ~a(){};
void test(int
i)
};class b :public
a ~b(){}
void
test()
};// 父類的 test函式需要傳入乙個int型別的引數,子類的test引數不需要傳入任何引數,此時若有如下語句:
// b b;
// b.test(1); //報錯
// 因為子類中的 void test() 函式已經把父類中的 void test(int i) 函式隱藏,這種方式下子類物件 b 並訪問不到 void test(int i),此時可通過 b.a::test(1) 這種方式訪問
C 的過載 重寫 隱藏
在同乙個class中 class demo 在同一訪問區內 如在同一.c cpp檔案內 即不在struct或者class中 4個fun都是過載函式 intfun int a void fun double a int fun int a,int b int fun float a 父類 class ...
過載 重寫 隱藏
共同點 函式名相同 定義 1 如果在類裡函式名相同但是形參不同,則為過載。形參不同包括形參的型別個數以及順序。2 類間。重寫和隱藏都發生在基類和派生類之間。重寫 覆蓋 發生在派生類和基類之間。必須滿足兩個條件 1 基類有virtual宣告 2 函式名和形參必須完全相同。隱藏 發生在派生類和基類之間,...
C 中過載 重寫(覆蓋)和隱藏的區別
基本概念 過載 是指同一可訪問區內被宣告的幾個具有不同引數列 引數的型別,個數,順序不同 的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。示例 class a 隱藏 是指派生類的函式遮蔽了與其同名的基類函式,注意只要同名函式,不管引數列表是否相同,基類函式都會被隱藏。示例 incl...