C++ 中重載、重寫、覆蓋和隱藏之間的區別

(1)重載:函數名相同,函數的參數類型和個數不同,注意與函數的返回值類型無關,重載必須在同一個類中

(2)重寫與覆蓋意義相同:在繼承和派生的時候纔可能出現,重寫(覆蓋)是指在派生類中存在重新定義的函數,其函數名、參數類型和數量必須與基類中的函數保持一致,只有函數體不同(即實現方式不同)。重寫的函數必須要有virtual關鍵字修飾,否則不能稱之爲重寫或者覆蓋

(3)隱藏:隱藏也是隻有在繼承或者派生中才可能出現的情況,隱藏是指派生類的函數屏蔽了其基類的函數。注意只要派生類中的函數名與其基類中的函數名相同,基類函數將會被屏蔽。注意隱藏方法無法實現多態性。

舉例

class Base
{
public:
	int add(int a, int b)
	{
		cout << "Base::add(int, int)" << endl;
		return a+b;
	}
	double add(double a, double b)  //重載
	{
		cout << "Base::add(double, double)" << endl;
		return a+b;
	}

	virtual int sub(int a, int b)
	{
		cout << "Base::sub(int, int)" << endl;
		return a-b;
	}
};

class Derive : public Base
{
public:
	int add() //隱藏了基函數中的add(int,int)和add(double,double),不具有多態性
	{
		cout << "Derive::add()" << endl;
		return 10;
	}

	virtual int sub(int a, int b)  //重寫(覆蓋)基函數中的sub(int,int),具有多態性
	{
		cout << "Derive::sub(int, int)" << endl;
		return a-b;
	}
};


int main()
{
	Derive d;
	Base *pb = &d;
	Derive *fd = &d;
	
	pb->add(10.0, 2.0); //Base::add(double, double),隱藏關係不具有多態性,因此無法訪問派生類中的函數
	pb->add(10, 2);   //Base::add(int, int),隱藏關係不具有多態性,因此無法訪問派生類中的函數中的函數
	pb->sub(10,2);    //Derive::sub(int, int),重寫(覆蓋)關係,可以訪問派生類中的函數

	fd->add();   //Derive::add()
	fd->sub(10,2); //Derive::sub(int, int)

	system("pause");
	return 0;
}

(1)Base類中的add(int, int)和add(double,double)是重載關係。

(2)Base類中的sub(int, int)和Derive類中的sub(int, int)是重寫關係,具有多態的特性。

(3)Base中的add(int, int)、add(double, double)和Derive類中的add()是隱藏關係,不具有多態性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章